복붙노트

[SQL] WHERE IN 조건이 문자열 값을 수락하지

SQL

WHERE IN 조건이 문자열 값을 수락하지

동적으로 형태의 사용자 이름, 작은 따옴표 ( ')와 쉼표 (,)를 추가하여 PL / SQL 프로 시저의 이름 _ 데이터의 문자열을 구성하고

'abc123','xyz456','pqr789'

하지만 SELECT 문의 WHERE IN 조건이 문자열을 통과 할 때

SELECT * FROM table_name WHERE USERNAME IN (user_data)

그것은 NO_DATA_FOUND 예외를 던지고있다.

내 문자열은 따옴표없이 한 명의 사용자 만이 포함 된 경우, 다른 한편으로는 해당 사용자 및 디스플레이 원하는 출력을 찾을 수 있습니다.

문자열 _ 데이터의 데이터 유형은 VARCHAR2입니다.

해결법

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

    1.당신은 컬렉션을 사용하여 수행 할 수 있습니다

    당신은 컬렉션을 사용하여 수행 할 수 있습니다

    CREATE TYPE VARCHAR2s_Table IS TABLE OF VARCHAR2(100);
    /
    

    다음과 같이 데이터를 입력합니다 :

    SELECT *
    FROM   table_name
    WHERE  user_data MEMBER OF VARCHAR2s_Table( 'abc123','xyz456','pqr789' );
    

    또한 :

    당신은 데이터를 분할 컬렉션을 생성하는 기능을 만들 수 있습니다 :

    CREATE TYPE VARCHAR2_TABLE AS TABLE OF VARCHAR2(4000);
    /
    
    CREATE OR REPLACE FUNCTION split_String(
      i_str    IN  VARCHAR2,
      i_delim  IN  VARCHAR2 DEFAULT ','
    ) RETURN VARCHAR2_TABLE DETERMINISTIC
    AS
      p_result       VARCHAR2_TABLE := VARCHAR2_TABLE();
      p_start        NUMBER(5) := 1;
      p_end          NUMBER(5);
      c_len CONSTANT NUMBER(5) := LENGTH( i_str );
      c_ld  CONSTANT NUMBER(5) := LENGTH( i_delim );
    BEGIN
      IF c_len > 0 THEN
        p_end := INSTR( i_str, i_delim, p_start );
        WHILE p_end > 0 LOOP
          p_result.EXTEND;
          p_result( p_result.COUNT ) := SUBSTR( i_str, p_start, p_end - p_start );
          p_start := p_end + c_ld;
          p_end := INSTR( i_str, i_delim, p_start );
        END LOOP;
        IF p_start <= c_len + 1 THEN
          p_result.EXTEND;
          p_result( p_result.COUNT ) := SUBSTR( i_str, p_start, c_len - p_start + 1 );
        END IF;
      END IF;
      RETURN p_result;
    END;
    /
    

    그럼 당신은 할 수 있습니다 :

    SELECT *
    FROM   table_name
    WHERE  user_data MEMBER OF split_String( 'abc123,xyz456,pqr789', ',' );
    

    또는:

    SELECT *
    FROM   table_name
    WHERE  user_data MEMBER OF split_String( TRIM( '''' FROM '''abc123'',''xyz456'',''pqr789''' ), ''',''' );
    
  2. ==============================

    2.이 같은 일이 아닙니다. 귀하의 표현은 동일

    이 같은 일이 아닙니다. 귀하의 표현은 동일

    SELECT * FROM table_name WHERE USERNAME = '''abc123'', ''xyz456'', ''pqr789''';
    

    결과가 없습니다 이유입니다.

    당신은 원하는 효과를 달성하기 위해, 이런 식으로 뭔가를 할 수 :

    SELECT * FROM table_name WHERE user_data like '%''' || USERNAME || '''%';
    

    그러나이 같은 생각하지 않을 것입니다.

  3. ==============================

    3.할 수 있습니다 같은 것을 사용하여 IN 절에서 동적 문자열 :

    할 수 있습니다 같은 것을 사용하여 IN 절에서 동적 문자열 :

    SQL> declare
      2      user_data varchar2(1000);
      3      vSQL      varchar2(2000);
      4      type      tabUser is table of varchar2(16);
      5      outData   tabUser;
      6  begin
      7      user_data := '''abc'', ''123'', ''zzz''';
      8      --
      9      vSQL := 'select userName from table_name where username in (' || user_data || ')';
     10      --
     11      execute immediate vSQL bulk collect into outData;
     12      --
     13      dbms_output.put_line('user_data: ' || user_data);
     14      for i in outData.first .. outData.last loop
     15          dbms_output.put_line('User: ' || outData(i));
     16      end loop;
     17  end;
     18  /
    user_data: 'abc', '123', 'zzz'
    User: abc
    User: 123
    
    PL/SQL procedure successfully completed.
    
    SQL> select * from table_name;
    
    USERNAME
    ----------------
    abc
    ABC
    123
    

    이 경우 당신은 항상 당신이 하나 이상의 사용자 이름이있는 경우에 상관없이, 당신의 문자열에 인용 된 이름을 사용하지합니다.

  4. ==============================

    4.당신의 선택 문

    당신의 선택 문

    SELECT * FROM 테이블 _ WHERE USERNAME IN (사용자 _)

    으로 처리됩니다

    SELECT * FROM TABLE_NAME WHERE USERNAME = "ABC123", "xyz456 ','pqr789 '

    이는 올바르지 않습니다.

    하나 개의 대안이다

    TABLE_NAME FROM SELECT * WHERE INSTR (_ 데이터, USERNAME)> 0

  5. from https://stackoverflow.com/questions/35648999/where-in-condition-not-accepting-string-value by cc-by-sa and MIT license