'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 визначення coalesce, одне з 2 аргументами, а інше зі списком аргументів, але ifnull викликає злиття з 2 параметрамиsql/item_cmpfunc.h 722: Item_func_ifnull(Item *a, Item *b) :Item_func_coalesce(a,b) {}
Felipe Buccioni

2
Відповідь є невірною, якщо існують різні типи звітів, ніж "N" та "P", див. Коментар BadHorsie у кращому рішенні "заява справи".
Trygve

3
@Trygve Питання стосується двох умов, і шукаючи 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`

5
@Evan: Правда. Я їх використовую для наочності. Не те, що це все одно впливає.
mellamokb

3
Я віддаю перевагу стандартному синтаксису ANSI над спеціальним синтаксисом для певної бази даних.
Гордон Лінофф

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;


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"


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.
Арт

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.