'SELECT' ifadesinde 'IF' - sütun değerlerine göre çıktı değerini seçin


685
SELECT id, amount FROM report

İhtiyacım amountolduğu amounttakdirde report.type='P've -amounteğer report.type='N'. Bunu yukarıdaki sorguya nasıl ekleyebilirim?

Yanıtlar:


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

Bkz. Http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html .

Ayrıca, koşul null olduğunda da işleyebilirsiniz. Geçersiz tutarda:

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

Parça , tutar boş değer olmadığında başka bir değer 0 olduğundaIFNULL(amount,0) anlamına gelir .


5
Burada COALESCE yerine bu IFNULL kullanmanın herhangi bir avantajı var mı acaba?
Chris

4
Mysql kaynağından, biri 2 argümanlı diğeri de argüman listesi olan 2 birleşim fark ettim, ancak ifnull 2 ​​parametreli birleşmeyi çağırırsql/item_cmpfunc.h 722: Item_func_ifnull(Item *a, Item *b) :Item_func_coalesce(a,b) {}
Felipe Buccioni

2
'N' ve 'P'den farklı rapor türleri varsa cevap doğru değil, daha iyi "vaka bildirimi" çözümünde BadHorsie'nin yorumuna bakın.
Trygve

3
@Trygve Soru 2 koşul içindir ve bir IFaçıklama mı arıyorsunuz, sorun nedir?
Felipe Buccioni

2
@Felipe, yanıtın% 100 doğru olması gerekmez, N ve P'den başka rapor türleri olabilir. Bu durumda, rapor türü (örnek olarak) 'E' ise -ambalaj'ı seçerek bir hataya neden olabilir. Yine de başka rapor türleri olup olmadığı sorusu akıl almaz, bu yüzden downvote'umu kaldırırım. Sadece bu durumlarda defansif olarak programlamayı seviyorum, bu yüzden diğer okuyuculara yöneliyorum.
Trygve

255

Bir caseifade kullanın :

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

5
@Evan: Doğru. Onları açıklık için kullanıyorum. Zaten bir şeyi etkilediği için değil.
mellamokb

3
Belirli bir veritabanı için özel sözdizimi yerine ANSI standart sözdizimini tercih ederim.
Gordon Linoff

2
Bu en iyi çözümdür, çünkü report.type için başka değerler varsa veya daha sonraki bir tarihte yeni bir report.type eklenirse, kabul edilen yanıt çözümü mutlaka uygun değildir. Diyor if report.type = 'P' use amount, otherwise use -amount for anything else. 'P' değilse türü dikkate almaz.
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

En basit yol bir IF () kullanmaktır . Evet Mysql, koşullu mantık yapmanızı sağlar. EĞER işlevi 3 parametre alırsa CONDITION, TRUE OUTCOME, FALSE OUTCOME.

Yani Mantık

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

Tüm hayırlar yalnızca + ve ise abs () 'yi atlayabilirsiniz.


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

UNION

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

ORDER BY id;

Sonuç kümeleri birbirini dışlayan olduğundan, burada UNION ALL'u tercih ederim.
Arth

4

Bunu da deneyebilirsiniz

 SELECT id , IF(type='p', IFNULL(amount,0), IFNULL(amount,0) * -1) as amount FROM table
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.