2014-09-24 3 views
1

WHERE 절을 기반으로 레코드를 선택하고 각 레코드가 WHERE 절의 필터를 통과 한 이유를 나타내는 열을 결과에 포함하려고합니다.WHERE 절의 결과에 따라 열 값 반환

name|location|networth|reason --reason is the part I need help with 
----------------------------- 
Joe |France |0  |Location 
Jeff|England |500  |Net worth 
Tim |France |500  |Net worth and location 

SELECT 절 내부의 WHERE 절의 조건을 반복하는 것보다 "이유"를 설정하는 청소기 방법이 있나요를 반환 할 수 있습니다

SELECT name, location, networth, reason 
FROM aTable 
WHERE location = "France" OR networth > "100" 

같은 뭔가?

답변

3

나는 이것을 연결 조건으로 사용합니다. 더 많은 것을 추가할수록 훨씬 쉽게됩니다. 그리고 대부분의 데이터베이스에서 하위 쿼리를 사용합니다. 이유를 결합 concat() 사용 :

select a.* 
from (select a.*, 
      concat((case when location = 'France' then 'France; ' else '' end), 
        (case when network > 100 then 'net worth; ' else '' end) 
        ) as reasons 
     from atable a 
    ) a 
where reasons <> ''; 

는 데이터베이스에 따라,이 쿼리에 다양한 뉘앙스가 있습니다 (문자열 연결은 예를 들어 다를 수 있습니다). 그러나 이것으로 이유를 한 번만 정의 할 수 있으며 where 절과 case 문에서 반복 할 필요가 없습니다.

+0

이 솔루션은 꽤 깔끔하지만 원하는 결과에 대한 변경 사항을 수락해야합니다. "위치 및 순자산 가치"를 산출하는 대신 "프랑스 순자산"을 산출합니다. 또한이 쿼리가 대용량 쿼리/데이터 집합의 일부로 사용되는 경우 SARG의 인덱스가 무시 될 것으로 예상되므로 성능을 신중하게 테스트 할 것입니다. –

+0

@ TabAlleman. . . (1) 네, 원하는 결과는 조금 다릅니다. 이것은이 문제에 직면했을 때의 형식입니다. (2) 인덱스는'또는'조건에 효과적으로 사용되지 않을 것입니다. –

1

이 작업을 수행하는 유일한 방법은 WHERE 절에서 조건을 반복하는 SELECT 절의 CASE 문을 사용하는 것입니다.

SELECT NAME, 
    location, 
    networth, 
    CASE 
     WHEN location = "France" 
      AND networth > "100" 
      THEN "Location and Net Worth" 
     WHEN location = "France" 
      THEN "Location" 
     WHEN networth > "100" 
      THEN "Net Worth" 
     END AS reason 
FROM aTable 
WHERE location = "France" 
    OR networth > "100" 
+1

거의 +1. CASE 문은 "Net Worth and location"대소 문자로 시작해야합니다. –

+0

나는 그 하나를 놓쳤다! 나는 그것을 지금 추가했다. – JNevill

+0

그리고 ... 나는 고든의 대답을 아래에 좋아한다. 그것은 복잡성을 더해 주지만 한 곳에서 조건을 변경해야한다는 OP의 요구에 만족합니다. 결과에 '이유'를 넣어야 할 필요성을 해결하는 대답이기 때문에 나는 내 의견을 남기고 있습니다. – JNevill