'SELECT'문에서 'IF'-열 값을 기반으로 출력 값을 선택하십시오.


685
SELECT id, amount FROM report

내가 필요 amountamount하는 경우 report.type='P'-amount경우 report.type='N'. 위의 쿼리에 이것을 어떻게 추가합니까?

답변:


1025
SELECT id, 
       IF(type = 'P', amount, amount * -1) as amount
FROM report

http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html을 참조 하십시오 .

또한 조건이 null 일 때 처리 할 수 ​​있습니다. 널 금액의 경우 :

SELECT id, 
       IF(type = 'P', IFNULL(amount,0), IFNULL(amount,0) * -1) as amount
FROM report

부분 IFNULL(amount,0)amount가 null이 아닌 경우를 의미 합니다. 그렇지 않으면 0을 반환 합니다.


5
여기서 COALESCE 대신이 IFNULL을 사용하면 이점이 있는지 궁금합니다.
Chris

4
MySQL의 소스에서, 나는 유착의 2 정의, 인수 목록 2 개 인자 하나, 그리고 다른 통지하지만, IFNULL는이 개 매개 변수를 사용하여 유착을 호출sql/item_cmpfunc.h 722: Item_func_ifnull(Item *a, Item *b) :Item_func_coalesce(a,b) {}
펠리페 Buccioni

2
'N'및 'P'와 다른 보고서 유형이있는 경우 정답이 올바르지 않습니다. 더 나은 "case statement"솔루션에서 BadHorsie의 주석을 참조하십시오.
Trygve

3
@Trygve 문제는 두 가지 조건에 대한 것이며 IF성명을 찾는 데 무엇이 잘못 되었습니까?
Felipe Buccioni

2
@Felipe, 답이 반드시 100 % 정확하지는 않습니다. N 및 P 이외의 다른 보고서 유형이있을 수 있습니다.이 경우 보고서 유형 (예 :)이 'E'인 경우 -amount를 선택하면 오류가 발생할 수 있습니다. 그래도 다른 보고서 유형이 있는지 질문에 언급하지 않으므로 하향 투표를 제거합니다. 나는이 경우 방어 적으로 프로그래밍하기를 좋아하므로 다른 독자들에게로 향한다.
Trygve

255

case진술을 사용하십시오 .

select id,
    case report.type
        when 'P' then amount
        when 'N' then -amount
    end as amount
from
    `report`

5
@Evan : 맞습니다. 나는 명확성을 위해 그것들을 사용합니다. 어쨌든 그것은 영향을 미치지 않습니다.
mellamokb

3
특정 데이터베이스의 사용자 지정 구문보다 ANSI 표준 구문을 선호합니다.
Gordon Linoff

2
report.type에 다른 값이 있거나 나중에 새로운 report.type이 도입 된 경우 허용되는 응답 솔루션이 반드시 적절하지는 않기 때문에 이것이 최상의 솔루션입니다. 말하는거야 if report.type = 'P' use amount, otherwise use -amount for anything else. 'P'가 아닌 경우 유형을 고려하지 않습니다.
BadHorsie

97
SELECT CompanyName, 
    CASE WHEN Country IN ('USA', 'Canada') THEN 'North America'
         WHEN Country = 'Brazil' THEN 'South America'
         ELSE 'Europe' END AS Continent
FROM Suppliers
ORDER BY CompanyName;

43
select 
  id,
  case 
    when report_type = 'P' 
    then amount 
    when report_type = 'N' 
    then -amount 
    else null 
  end
from table

15

가장 간단한 방법은 IF () 를 사용하는 것 입니다. 예 Mysql을 사용하면 조건부 논리를 수행 할 수 있습니다. IF 함수는 3 개의 매개 변수 CONDITION, TRUE OUTCOME, FALSE OUTCOME을 갖습니다.

그래서 논리는

if report.type = 'p' 
    amount = amount 
else 
    amount = -1*amount 

SQL

SELECT 
    id, IF(report.type = 'P', abs(amount), -1*abs(amount)) as amount
FROM  report

no가 모두 + ve 인 경우 abs ()를 건너 뛸 수 있습니다.


12
SELECT id, amount
FROM report
WHERE type='P'

UNION

SELECT id, (amount * -1) AS amount
FROM report
WHERE type = 'N'

ORDER BY id;

결과 집합은 상호 배타적이므로 UNION ALL을 선호합니다.
Arth

4

이것도 시도해 볼 수 있습니다

 SELECT id , IF(type='p', IFNULL(amount,0), IFNULL(amount,0) * -1) as amount FROM table
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.