2012-11-04 5 views
0

가능한 중복 :이 같은 쉼표로 구분 된 문자열과 같은 값으로 내 테이블 Tbl_Prefix의 열 Prefix
how to pass a variable in WHERE IN clause of oracle sql?SQL 쿼리의 IN 절에서 문자열을 쉼표로 구분

:

'aaa','bbb','ccc' 

저는 직원 테이블이 있습니다 Tbl_Employee li KE이 : ​​

내가이 쿼리 내 WHERE 조항의 IN 부분이 접두사를 사용할 필요가
Empno Prefix 
------------ 
1000 aaa 
2000 eee 
3000 ccc 
4000 aaa 
5000 ddd 

:

내부 선택 쿼리 select Tbl_Prefix.prefix from Tbl_Prefix where Tbl_Prefix.flag='y'는 방법 결과 'aaa','bbb','ccc'

있다

Select * 
from Tbl_Employee 
where Tbl_Employee.Prefix in (select Tbl_Prefix.prefix 
           from Tbl_Prefix 
           where Tbl_Prefix.flag = 'y') 

올바른 결과를 얻을 수 있도록 'IN'절에서이 문자열을 사용하십시오.

+1

데이터베이스 ??????? – nawfal

+0

데이터베이스가 SQL Server 2008 – Soumya

+5

그런데 이러한 값이 데이터베이스에 저장되는 경우 데이터베이스 디자인을 심각하게 재검토해야합니다. 각 상위 레코드에 대한 각 쉼표로 구분 된 값에 대한 레코드가 들어있는 하위 테이블을 만듭니다. 데이터가 이와 같이 덤프 된 경우 원시 데이터를 이와 같은 구조로 처리하는 작업을 만듭니다. 적절한 테이블 구조를 사용하면 비교적 간단한 내부 조인 만 필요할 것입니다. – GolezTrol

답변

1

먼저 그렇게하지 마십시오. 데이터 버킷/링크 테이블을 작성하고 aaa, bbb 및 ccc를 관련 관계에 연결하십시오.

그러나이 방법으로 가능하면 변경하십시오! 동적 SQL 문자열을 만들어 실행해야합니다. 따라서 select를 통해 where를 통해 문자열을 만들고 "접두사"로 구분 된 문자열을 추가 한 다음 EXEC을 호출하십시오.

그래서, 당신은 설정합니다 :

@sql = 'SELECT YOURSTUFF FROM YOURTABLE WHERE YOURCOLUMN IN ' + @prefix.@prefix 당신이 필요 tbl_Prefix에서 열 값 (AAA, BBB, CCC)이어야한다. 당신의 문자열이 구축되면

, EXEC @sql

0

그 값이 그런 당신이 데이터베이스에 저장되어있는 경우, 당신은 심각하게 당신의 데이터베이스 디자인을 재고해야한다. 각 상위 레코드에 대한 각 쉼표로 구분 된 값에 대한 레코드가 들어있는 하위 테이블을 만듭니다.

지금은 EXISTSLIKE을 사용하면 빠져 나올 수 있지만 많은 양의 기록이있는 경우이 쿼리는 곧 느려질 것입니다.

select 
    * 
from 
    Tbl_Employee e 
where 
    exists 
    (select * from 
     Tbl_Prefix x 
    where 
     x.flag = 'y' and 
     x.prefix like '%''' + e.prefix + '''%') 
     -- Add quotes to prevent false matches 
관련 문제