Program Tip

동일한 열에서 여러 WHERE 조건으로 선택

programtip 2020. 11. 21. 09:24
반응형

동일한 열에서 여러 WHERE 조건으로 선택


좋아, 나는 여기에서 명백하고 단순한 것을 간과하고 있다고 생각한다 ...하지만 동일한 열에서 여러 기준과 일치하는 레코드 만 반환하는 쿼리를 작성해야합니다

내 테이블은 사용자에게 플래그를 적용하기위한 매우 간단한 연결 설정입니다.

ID   contactid  flag        flag_type 
-----------------------------------
118  99         Volunteer   1 
119  99         Uploaded    2 
120  100        Via Import  3 
121  100        Volunteer   1  
122  100        Uploaded    2

등 ...이 경우 연락처 99와 100이 모두 "Volunteer"및 "Uploaded"로 플래그 지정된 것을 볼 수 있습니다.

내가 할 수 있어야 할 것은 검색 양식을 통해 입력 한 여러 기준과 일치하는 연락처 ID 만 반환하는 것입니다 ... 연락처 ID는 선택한 모든 플래그와 일치해야합니다 ... 내 머리에 SQL은 다음과 같이 보일 것입니다.

SELECT contactid 
 WHERE flag = 'Volunteer' 
   AND flag = 'Uploaded'...

하지만 ... 아무것도 반환하지 않습니다 ... 내가 여기서 뭘 잘못하고 있니?


GROUP BYHAVING COUNT(*) = _다음을 사용할 수 있습니다 .

SELECT contact_id
FROM your_table
WHERE flag IN ('Volunteer', 'Uploaded', ...)
GROUP BY contact_id
HAVING COUNT(*) = 2 -- // must match number in the WHERE flag IN (...) list

( contact_id, flag유일 하다고 가정 ).

또는 조인을 사용하십시오.

SELECT T1.contact_id
FROM your_table T1
JOIN your_table T2 ON T1.contact_id = T2.contact_id AND T2.flag = 'Uploaded'
-- // more joins if necessary
WHERE T1.flag = 'Volunteer'

플래그 목록이 매우 길고 일치하는 항목이 많으면 첫 번째가 더 빠를 것입니다. 플래그 목록이 짧고 일치하는 항목이 거의없는 경우 두 번째가 더 빠르다는 것을 알 수 있습니다. 성능이 문제가되는 경우 데이터에서 두 가지를 모두 테스트하여 어떤 것이 가장 잘 작동하는지 확인하십시오.


사용하다:

  SELECT t.contactid
    FROM YOUR_TABLE t
   WHERE flag IN ('Volunteer', 'Uploaded')
GROUP BY t.contactid
  HAVING COUNT(DISTINCT t.flag) = 2

중요한 것은 계산 t.flagIN절의 인수 수와 같아야 한다는 것입니다 .

의 사용은 COUNT(DISTINCT t.flag)contactid와 flag의 조합에 고유 한 제약이없는 경우입니다. 중복 가능성이 없으면 쿼리에서 DISTINCT를 생략 할 수 있습니다.

  SELECT t.contactid
    FROM YOUR_TABLE t
   WHERE flag IN ('Volunteer', 'Uploaded')
GROUP BY t.contactid
  HAVING COUNT(t.flag) = 2

다음과 같이 INTERSECT를 사용하는 것이 좋습니다.

SELECT contactid WHERE flag = 'Volunteer' 
INTERSECT
SELECT contactid WHERE flag = 'Uploaded'

나는 그것이 가장 물류 솔루션이라고 생각합니다.


실제로 테이블을 볼 수는 없지만 플래그는 'Volunteer'및 'Uploaded'가 될 수 없습니다. 열에 여러 값이있는 경우 다음을 사용할 수 있습니다.

WHERE flag LIKE "%Volunteer%" AND flag LIKE "%UPLOADED%"

형식이 지정된 테이블을 보면 실제로 적용 할 수 없습니다.


다음 대체 쿼리를 사용해보십시오.

SELECT A.CONTACTID 
FROM (SELECT CONTACTID FROM TESTTBL WHERE FLAG = 'VOLUNTEER')A , 
(SELECT CONTACTID FROM TESTTBL WHERE FLAG = 'UPLOADED') B WHERE A.CONTACTID = B.CONTACTID;

SELECT contactid, Count(*) 
FROM <YOUR_TABLE> WHERE flag in ('Volunteer','Uploaded')  
GROUP BY contactid 
HAVING count(*)>1;

이것을 사용하십시오 : 예 :

select * from ACCOUNTS_DETAILS
where ACCOUNT_ID=1001
union
select * from ACCOUNTS_DETAILS
where ACCOUNT_ID=1002

AND를 OR로 변경합니다. 단순한 실수. 평범한 영어처럼 생각하세요. 저는 이것 또는 저것과 같은 것을 선택하고 싶습니다.


AND당신에게 모두 만 답변을 반환 volunteer하고 uploaded당신의 열의에 존재합니다. 그렇지 않으면 null을 반환 합니다 ...

OR당신의 진술에서 사용해보십시오 ...

SELECT contactid  WHERE flag = 'Volunteer' OR flag = 'Uploaded'

select purpose.pname,company.cname
from purpose
Inner Join company
on purpose.id=company.id
where pname='Fever' and cname='ABC' in (
  select mname
  from medication
  where mname like 'A%'
  order by mname
); 

귀하의 코드 :

SELECT contactid 
WHERE flag = 'Volunteer' AND flag = 'Uploaded' [...]

테이블 이름을 선언하지 않았기 때문에 작동하지 않습니다. 실행은 오류 메시지를 반환합니다.

두 검색 쿼리를 모두 표시하려면 코드가 다음과 같아야합니다.

SELECT * FROM (your_table_name) WHERE flag = 'Volunteer' OR flag = 'Uploaded';

항상 false를 반환하므로 이와 같지 않습니다. SELECT * FROM (your_table_name) WHERE flag = 'Volunteer'AND flag = 'Uploaded';

당신은 또한 이것을 할 수 있습니다

SELECT * FROM (your_table_name) 
WHERE flag = 'Volunteer' OR flag = 'Uploaded' 
ORDER BY contactid, flag asc; 

(asc for ascending order, you can also change it to desc if you want it to display in descending order)


Sometimes you can't see the wood for the trees :)

Your original SQL ..

SELECT contactid 
 WHERE flag = 'Volunteer' 
   AND flag = 'Uploaded'...

Should be:

SELECT contactid 
 WHERE flag = 'Volunteer' 
   OR flag = 'Uploaded'...

참고URL : https://stackoverflow.com/questions/4047484/selecting-with-multiple-where-conditions-on-same-column

반응형