[SQL] WHERE IN 조건이 문자열 값을 수락하지
SQLWHERE IN 조건이 문자열 값을 수락하지
동적으로 형태의 사용자 이름, 작은 따옴표 ( ')와 쉼표 (,)를 추가하여 PL / SQL 프로 시저의 이름 _ 데이터의 문자열을 구성하고
'abc123','xyz456','pqr789'
하지만 SELECT 문의 WHERE IN 조건이 문자열을 통과 할 때
SELECT * FROM table_name WHERE USERNAME IN (user_data)
그것은 NO_DATA_FOUND 예외를 던지고있다.
내 문자열은 따옴표없이 한 명의 사용자 만이 포함 된 경우, 다른 한편으로는 해당 사용자 및 디스플레이 원하는 출력을 찾을 수 있습니다.
문자열 _ 데이터의 데이터 유형은 VARCHAR2입니다.
해결법
-
==============================
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.이 같은 일이 아닙니다. 귀하의 표현은 동일
이 같은 일이 아닙니다. 귀하의 표현은 동일
SELECT * FROM table_name WHERE USERNAME = '''abc123'', ''xyz456'', ''pqr789''';
결과가 없습니다 이유입니다.
당신은 원하는 효과를 달성하기 위해, 이런 식으로 뭔가를 할 수 :
SELECT * FROM table_name WHERE user_data like '%''' || USERNAME || '''%';
그러나이 같은 생각하지 않을 것입니다.
-
==============================
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.당신의 선택 문
당신의 선택 문
SELECT * FROM 테이블 _ WHERE USERNAME IN (사용자 _)
으로 처리됩니다
SELECT * FROM TABLE_NAME WHERE USERNAME = "ABC123", "xyz456 ','pqr789 '
이는 올바르지 않습니다.
하나 개의 대안이다
TABLE_NAME FROM SELECT * WHERE INSTR (_ 데이터, USERNAME)> 0
from https://stackoverflow.com/questions/35648999/where-in-condition-not-accepting-string-value by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 활성 SQL Server 연결을 볼 수 있습니까? (0) | 2020.04.28 |
---|---|
[SQL] 왜 당신은 데이터베이스에보기를 만들려면 어떻게해야합니까? (0) | 2020.04.28 |
[SQL] 해, PreparedStatement의 입력 매개 변수로 열 이름을 갖는 (0) | 2020.04.28 |
[SQL] R의 동적은 "문자열" (0) | 2020.04.28 |
[SQL] 함수에서 반환 녹음 열이 연결된했다 (0) | 2020.04.28 |