«IF» в выражении «SELECT» - выберите выходное значение на основе значений столбца

685
SELECT id, amount FROM report

Мне нужно amountбыть, amountесли 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 .

Кроме того, вы можете обработать, когда условие является нулевым. В случае нулевой суммы:

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

Часть IFNULL(amount,0)означает, что когда сумма не равна нулю, возвращается сумма, иначе возвращается 0 .

Фелипе Буччони
источник
5
Интересно, есть ли какое-то преимущество в использовании этого IFNULL вместо COALESCE?
Крис
4
Из источника mysql я замечаю 2 определения объединения, одно с двумя аргументами, а другое со списком аргументов, но ifnull вызывает объединение с 2 параметрамиsql/item_cmpfunc.h 722: Item_func_ifnull(Item *a, Item *b) :Item_func_coalesce(a,b) {}
Фелипе Буччони,
2
Ответ неверен, если существуют типы отчетов, отличные от «N» и «P», см. Комментарий BadHorsie в лучшем решении «выписка по делу».
Trygve
3
@Trygve Вопрос для 2 условий, и ищет IFутверждение, что не так?
Фелипе Буччони
2
@Felipe, ответ не обязательно на 100% правильный, могут быть другие типы отчетов, кроме N и P. В вашем случае это может привести к ошибке, выбрав -amount, если тип отчета (в качестве примера) равен 'E'. Однако в вопросе не упоминается, существуют ли другие типы отчетов, поэтому я убрал свое отрицательное мнение. Я просто люблю программировать в таких случаях, чтобы быть внимательным к другим читателям.
Trygve
255

Используйте caseутверждение:

select id,
    case report.type
        when 'P' then amount
        when 'N' then -amount
    end as amount
from
    `report`
mellamokb
источник
5
@Evan: правда. Я использую их для ясности. Не то чтобы это все равно влияло.
mellamokb
3
Я предпочитаю стандартный синтаксис ANSI, а не пользовательский синтаксис для конкретной базы данных.
Гордон Линофф
2
Это лучшее решение, потому что принятое решение ответа не обязательно подходит, если есть другие значения для report.type или если новый отчет.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;
user1210826
источник
43
select 
  id,
  case 
    when report_type = 'P' 
    then amount 
    when report_type = 'N' 
    then -amount 
    else null 
  end
from table
пел каул
источник
15

Самый простой способ - использовать IF () . Да, Mysql позволяет вам делать условную логику. ЕСЛИ функция принимает 3 параметра: СОСТОЯНИЕ, ИСТИННЫЙ РЕЗУЛЬТАТ, ЛОЖНЫЙ РЕЗУЛЬТАТ.

Так логика

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

Вы можете пропустить abs (), если все нет - только + ve

aWebDeveloper
источник
12
SELECT id, amount
FROM report
WHERE type='P'

UNION

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

ORDER BY id;
linitux
источник
Поскольку наборы результатов являются взаимоисключающими, я предпочитаю UNION ALL здесь.
Арт
4

Вы можете попробовать это также

 SELECT id , IF(type='p', IFNULL(amount,0), IFNULL(amount,0) * -1) as amount FROM table
Базантские правила
источник