Spring

연결 기준을 사용하여 쉼표로 구분 된 값을 열로 분할하는 방법

기록만이살길 2021. 3. 17. 03:03
반응형

연결 기준을 사용하여 쉼표로 구분 된 값을 열로 분할하는 방법

1. 질문(문제점):

쉼표로 구분 된 값이 50 개 미만인 열이 있습니다. 그리고 해당 특정 열에서 쉼표로 구분 된 값의 수가 일정하지 않습니다.이 테이블을 IN / AND / OR 절을 사용하여 쉼표로 구분 된 값으로 쿼리하고 싶습니다.

그래서 다음과 같이하고 싶습니다.

  • 선택 쿼리에서 이러한 값을 별도의 열로 분할
  • AND, OR 및 IN을 사용하여 개인의 시장 코드를 쿼리합니다.
    • EUP 및 APCAC
    • APAC 또는 EU 또는 CA
    • IN (APAC, EU, LATIM)

이 쿼리를 스프링 데이터 jpa 네이티브 쿼리에서 사용해야합니다.

많은 substr을 사용하고 싶지 않습니다.

다음 답변 -ans1ans2를 참조 한 후 connect by with level을 사용하여 이것을 수행하는 것이 유용 할 것이라고 생각 했습니다.

사용자 테이블 :

사용자 이름 market_code 사용
남자 eup, apac, 라팀 0
세바스찬 apac, 라팀 0
자비에르 ca, apac, Latim 0

그러나 다음은 3 개의 행이있을 것으로 예상되는 행 하나만 반환합니다.

select regexp_substr(market_code,'[^|]+', 1, level) from testautomadm.userpool
where  AND USERNAME = 'john'
connect by regexp_substr('market_code', '[^|]+', 1, level)  
is not null

이 사용 사례를 해결하는 데 도움을 주시면 감사하겠습니다.

감사합니다!

2. 해결방안:

multiset다음과 같이 및 계층 쿼리를 사용할 수 있습니다 .

Select user_name, 
       listagg(market_code, ',') within group (order by pos) as market_code,
       In_use
  From
(Select user_name, 
       regexp_substr(market_code, '[^,]+',1, column_value) as market_code, 
       in_use,
       column_value as pos
  From t,
       table(cast(multiset(
         select level from dual 
         connect by level <= length (regexp_replace(t.market_code, '[^,]+'))  + 1
        ) as sys.OdciNumberList)) levels) t
  Where market_code in ('EUP','APCAC')
  Group by user_name, in_use
  Having count(distinct market_code) = 2

위의 쿼리는 AND우리가 사용한 것과 같은 사용법을 보여줍니다. for And 쿼리 에서 각각의 market_code를 사용할 count = 2수 있습니다.count = 1INORIN

65661118
반응형