2014-09-07 3 views
1

DB 2를 사용하고 주어진 값 집합에 대해 여러 열을 검사하는 쿼리를 작성하려고합니다. 필드 a, 필드 b 및 필드 c와 마찬가지로 값 x, y, z, f. 내가 생각할 수있는 한 가지 방법은 같은 조건을 세 번 쓰는 것입니다. 즉 field a in ('x','y','z','f') or field b in .... and so on입니다. 이 작업을 수행하는 다른 효율적이고 쉬운 방법이 있다면 알려주십시오. 어떤 조건이 true 인 경우와 같은 쿼리를 찾고 있는데 그렇지 않으면 return no else no. 제발 제안!"in"문에서 복수 열

+0

주들은 자주 방법을 찾는다. – WarrenT

답변

1

이 수도 있고 AS400에서 작동하지 않을 수 있습니다 :

create table a (a int not null, b int not null); 
insert into a (a,b) values (1,1),(1,3),(2,3),(0,23); 

select a.* 
from a 
where a in (1,2) or b in (1,2); 

A   B   
----------- ----------- 
      1   1 
      1   3 
      2   3 

로 다시 쓰기 조인 :

select a.* 
from a 
join (values (1),(2)) b (x) 
    on b.x in (a.a, a.b); 

A   B   
----------- ----------- 
      1   1 
      1   3 
      2   3 
+0

2 열로 테이블을 만들어야하는 이유가 무엇인지 모르겠다. – Charles

+0

진지한가? create table 문은 샘플 데이터 용이며 솔루션과는 아무런 관련이 없습니다. – Lennart

+0

예. 나는 너의 대답을 전혀 따르지 않을 것이다. 어쩌면 문자 대신 정수를 사용하는 것일 수도 있습니다. – Charles

0

당신은 문자 집합을 설명하는 정규 표현식을 작성하고 XQuery를

로 사용할 수 있습니다
+0

DB2 for i에서 어떻게 수행합니까? – WarrenT

1

열 데이터 유형이 동일하다고 가정하면 IN을 사용하여 검색하려는 모든 열을 하나의 열로 합치는 하위 쿼리를 만듭니다.

SELECT * 
FROM (
     SELECT 
     YOUR_TABLE_PRIMARY_KEY 
     ,A AS Col 
     FROM YOUR_TABLE 
     UNION ALL 
     SELECT 
     YOUR_TABLE_PRIMARY_KEY 
     ,B AS Col 
     FROM YOUR_TABLE 
     UNION ALL 
     SELECT 
     YOUR_TABLE_PRIMARY_KEY 
     ,C AS Col 
     FROM YOUR_TABLE 
) AS SQ 
WHERE 
    SQ.Col IN ('x','y','z','f') 

것은 당신이 데이터는 (7.1 TR6 테스트)를 OS의 지원되는 버전에있어 가정

+0

이 문제에 몇 가지 문제점이 있습니다 ... 'UNION ALL'은 중복 행을 허용합니다. 'UNION'은 그것을 막을 것입니다.그러나 성과 위약이있을 것으로 판단됩니다. OP가 전체 행을 필요로한다고 가정하면 원본 테이블에 다시 가입하면 가격을 지불하게됩니다. – Charles

+0

단순히 "전체 행"을 가져 오기 위해 합류 할 필요가 없습니다. YOUR_TABLE_PRIMARY_KEY 대신 NTUR (Nested Table Expression)로 UNION 조회의 각 subselect에 YOUR_TABLE. *을 포함 시키십시오. 그 수정 된 질의에 대한 가능한 부가 가치의 [duplicates은 여전히 ​​포함되어 있지만] 단지 표시기 yes \ no가 아니라 일치하는 값인 열을 식별하는 기능입니다. 물론 "아니오"값은 포함되지 않습니다. 파생 테이블 식의 추가 열을 각 "AS Col"뒤에 추가 할 수 있습니다. 예 : ", CHAR ('Col_?') AS PerCol"각 "?" as, A, B 및 C – CRPence

0

을 의미하는 행 알 수 있도록 테이블 키를 포함해야합니다,이 작업을해야합니다 ... 당신의 영업 이익을 요구하기 때문에 위의 확장

with sel (val) as (values ('x'),('y'),('f')) 
select * from mytbl       
where flda in (select val from sel)   
    or fldb in (select val from sel)   
    or fldc in (select val from sel)   

, 것 '예'또는 빈 세트 확인할 수있는 행의 열쇠를 가지고 가정

"조건이 true가 돌려 예 또 다른 사람이다" 충분 해? somekey은 확인할 행의 키입니다.

with sel (val) as (values ('x'),('y'),('f')) 
select 'yes' from mytbl       
where thekey = somekey 
    and (flda in (select val from sel)   
     or fldb in (select val from sel)   
     or fldc in (select val from sel) 
     ) 

일치하는 행이 없으면 값을 반환하기가 실제로 어렵습니다. 한 가지 방법이 있습니다. 그것은 뭔가 당신이 뭔가보고 충분히 밝은 창조적 인 경우 ;-) 할 수없는 말을 위험한 제안이 꽤 자주의 @NageshKumar .. 내가 더 = 0 예 = 1 스위치를했습니다

with sel (val) as (values ('x'),('y'),('f')) 
select 1 from mytbl       
where thekey = somekey 
    and (flda in (select val from sel)   
     or fldb in (select val from sel)   
     or fldc in (select val from sel) 
     ) 
UNION ALL 
select 0    
from sysibm.sysdummy1 
order by 1 desc   
fetch first row only