복붙노트

[SQL] 정규식 널 (null)을 허용 목록에서 n 번째 값을 선택합니다

SQL

정규식 널 (null)을 허용 목록에서 n 번째 값을 선택합니다

I은 쉼표로 구분으로부터 n 번째 값을 반환 REGEXP_SUBSTR ()를 사용하고있다. 이 모든 값이있을 때 잘 작동하지만 항목이 null의 경우 실패합니다. 여기에 모든 값이 존재하고 내가 쉼표 아닌 1 개 이상의 문자의 2 차 발생을 선택하고 위치를 작동하는 예입니다 :

SQL> select REGEXP_SUBSTR('1,2,3,4,5,6', '[^,]+', 1, 2) data
  2  from dual;

D
-
2

두 번째 값이 null 때, 난 정말 물론 정말 쉼표 아닌 1 개 이상의 문자의 두 번째 발생에있는 목록의 세 번째 항목을 얻고있다. 그러나, 나는 두 번째 항목이 비어로는 NULL을 반환해야합니다

SQL> select REGEXP_SUBSTR('1,,3,4,5,6', '[^,]+', 1, 2) data
  2  from dual;

D
-
3

내가 대신 1 이상의 0 개 이상의 문자를 허용하는 정규 표현식을 변경하는 경우, 그것은 또한 널 과거 번호 실패 :

SQL> select REGEXP_SUBSTR('1,,3,4,5,6', '[^,]*', 1, 4) data
  2  from dual;

D
-
3

나는 널 위해 허용해야하지만, 구문 권리를 얻을 수없는 것. 논리적으로 나는 데이터가 존재 여부 쉼표의 n 번째 발생하기 전에 무엇 반환 (그리고 마지막 값을 허용) 할 필요가있다. 어떤 아이디어?

해결법

  1. ==============================

    1.대답하는 사람들에게 감사합니다. 답 및 공급 링크에서 답변을 정독 한 후,이 솔루션에 도착했다 :

    대답하는 사람들에게 감사합니다. 답 및 공급 링크에서 답변을 정독 한 후,이 솔루션에 도착했다 :

    SQL> select REGEXP_SUBSTR('1,,3,4,5', '(.*?)(,|$)', 1, 2, NULL, 1) data
      2  from dual;
    
    Data
    ----
    

    어느 쉼표 나 줄의 끝으로 종료하는 0 개 이상의 문자의 선택 세트의 2 차 발생 봐 "라고 설명하고, 데이터를 덜 쉼표 또는 종료되는 (1 하위 그룹을 반환 할 수있다 선).

    나는 등, 다양한 위치를 선택, 나는 다양한 위치, 여러 널에 널 테스트를 언급하는 것을 잊었다

    내가 찾을 수있는 유일한주의해야 할 점은 당신이 보는 필드를 사용할 수보다 큰 경우 당신이 알고 있어야합니다, 그래서 그냥 NULL을 반환합니다. 내 경우에 대한 문제가되지 않습니다.

    편집 : 나는이 우연히 발견 할 수있다 미래 수색자의 이익을 위해 허용 대답을 업데이트하고 있습니다.

    다음 단계는 단순 함수로 재사용 할 수 있도록하는 코드를 캡슐화한다. 여기서 함수 소스이다 :

      FUNCTION  GET_LIST_ELEMENT(string_in VARCHAR2, element_in NUMBER, delimiter_in VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS
        BEGIN
          RETURN REGEXP_SUBSTR(string_in, '(.*?)(\'||delimiter_in||'|$)', 1, element_in, NULL, 1);
      END GET_LIST_ELEMENT;
    

    그것은 너무 편안 때 사용 어쨌든 코드 청소기하게하지 않을 수 있습니다 개발자 이는 가죽 정규식 복잡성을. 4 요소를 얻기 위해 다음과 같이 호출 :

    select get_list_element('123,222,,432,555', 4) from dual;
    
  2. ==============================

    2.어떻게 이런 잔인한 대해 뭔가 :

    어떻게 이런 잔인한 대해 뭔가 :

    select REGEXP_SUBSTR(replace('1,,3,4,5,6', ',,', ',NULL,'), '[^,]+', 1, 2) data
    from dual
    

    즉, 문자열 값을 반환합니다. 당신은 케이스를 사용하여 실제 NULL를 얻을 수 있습니다 :

    select (case when REGEXP_SUBSTR(replace('1,,3,4,5,6', ',,', ',NULL,'), '[^,]+', 1, 2) = 'NULL'
                 then NULL
                 else REGEXP_SUBSTR(replace('1,,3,4,5,6', ',,', ',NULL,'), '[^,]+', 1, 2)
            end)
    from dual;
    

    거기에 regexp_ 전용 솔루션이 될 수 있지만이 먼저 떠오르는 것입니다 수 있습니다.

  3. from https://stackoverflow.com/questions/25648653/regex-to-select-nth-value-from-a-list-allowing-for-nulls by cc-by-sa and MIT license