2017-03-09 8 views
4

내 SQL 쿼리는 다음과 같이보고 WHERE 조항이 포함되어 있습니다.WHERE 절에서 같은 목록을 두 번 사용하는 방법은 무엇입니까? (그리고 내 진짜리스트가 실제로 이상) 매우 불만족 동일한 목록이 두 번 나타납니다</p> <pre><code>WHERE name1 in ('Emily', 'Jack', 'James', 'Chloe') OR name2 in ('Emily', 'Jack', 'James', 'Chloe') </code></pre> <p>참고 :

이 쿼리를 작성하는 더 좋은 방법은 무엇입니까?

+0

(다른 테이블에서)'name1' 별도의 행에'name2'를 저장하기 위해 더 좋을 것이다. –

+0

물론 그렇 겠지만 DB를 디자인하지 않았습니다. 방금 읽기 전용 액세스 권한이 있습니다. – Scarabee

답변

7
당신은 배열을 사용할 수 있습니다

overlap operator &&, 예컨대 :

with my_table(name1, name2) as (
values ('Emily', 'Bob'), ('Ben', 'Jack'), ('Bob', 'Ben') 
) 

select * 
from my_table 
where array[name1, name2] && array['Emily', 'Jack', 'James', 'Chloe']; 

name1 | name2 
-------+------- 
Emily | Bob 
Ben | Jack 
(2 rows) 
4

공통 테이블 식을 사용

with to_check (name) as (
    values ('Emily'), ('Jack'), ('James'), ('Chloe') 
) 
select ... 
from ... 
WHERE name1 in (select name from to_check) 
    OR name2 in (select name from to_check); 
-1

한 가지 방법은 정규 표현식이다 :

WHERE (name1 || ' ' || name2) ~ 'Emily|Jack|James|Chloe' 

정확히 같은 논리 아닙니다 (이름이 "에밀리 미상은"이 일치합니다 논리지만 첫 번째는 아니지만),하지만 당신이 원하는대로 할 수 있습니다.