'JIKA' dalam pernyataan 'SELECT' - pilih nilai output berdasarkan nilai kolom

685
SELECT id, amount FROM report

Saya perlu amountuntuk menjadi amountjika report.type='P'dan -amountjika report.type='N'. Bagaimana cara menambahkan ini ke kueri di atas?

Michael
sumber

Jawaban:

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

Lihat http://dev.mysql.com/doc/refman/5.0/id/control-flow-functions.html .

Selain itu, Anda bisa menangani ketika kondisinya nol. Dalam hal jumlah nol:

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

Bagian itu IFNULL(amount,0)berarti ketika jumlah bukan nol, jumlah yang lain mengembalikan 0 .

Felipe Buccioni
sumber
5
Saya ingin tahu apakah ada manfaat menggunakan IFNULL ini daripada COALESCE di sini?
Chris
4
Dari sumber mysql, saya melihat 2 definisi coalesce, satu dengan 2 argumen, dan lainnya dengan daftar argumen, tetapi ifnull memanggil coalesce dengan 2 parametersql/item_cmpfunc.h 722: Item_func_ifnull(Item *a, Item *b) :Item_func_coalesce(a,b) {}
Felipe Buccioni
2
Jawabannya tidak benar jika ada tipe laporan yang berbeda dari 'N' dan 'P', lihat komentar BadHorsie dalam solusi "pernyataan kasus" yang lebih baik.
Coba
3
@Trygve Pertanyaannya adalah untuk 2 syarat, dan mencari IFpernyataan, ada apa?
Felipe Buccioni
2
@Felipe, jawabannya belum tentu 100% benar, mungkin ada jenis laporan selain N dan P. Dalam kasus Anda, ini dapat menyebabkan kesalahan, memilih -jumlah jika jenis laporan (sebagai contoh) adalah 'E'. Pertanyaannya gagal menyebutkan apakah ada tipe laporan lain, jadi saya menghapus downvote saya. Saya hanya ingin memprogram pertahanan dalam kasus-kasus ini, jadi silakan membaca pembaca lainnya.
Trygve
255

Gunakan casepernyataan:

select id,
    case report.type
        when 'P' then amount
        when 'N' then -amount
    end as amount
from
    `report`
mellamokb
sumber
5
@ Evan: Benar. Saya menggunakannya untuk kejelasan. Lagipula itu tidak mempengaruhi apa pun.
mellamokb
3
Saya lebih suka sintaks standar ANSI daripada sintaks khusus untuk database tertentu.
Gordon Linoff
2
Ini adalah solusi terbaik karena solusi jawaban yang diterima belum tentu sesuai jika ada nilai lain untuk report.type, atau jika report.type baru diperkenalkan di kemudian hari. Ia mengatakan if report.type = 'P' use amount, otherwise use -amount for anything else. itu tidak akan mempertimbangkan jenisnya jika bukan '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;
pengguna1210826
sumber
43
select 
  id,
  case 
    when report_type = 'P' 
    then amount 
    when report_type = 'N' 
    then -amount 
    else null 
  end
from table
sang kaul
sumber
15

Cara paling sederhana adalah dengan menggunakan IF () . Ya Mysql memungkinkan Anda untuk melakukan logika kondisional. JIKA fungsi membutuhkan 3 params KONDISI, BENAR LUAR, LUAR SALAH.

Jadi Logika adalah

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

Anda dapat melewati abs () jika semua no adalah + ve saja

aWebDeveloper
sumber
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
sumber
Karena set hasil saling eksklusif, saya lebih suka UNION ALL di sini.
Arth
4

Anda dapat mencoba ini juga

 SELECT id , IF(type='p', IFNULL(amount,0), IFNULL(amount,0) * -1) as amount FROM table
Aturan Basant
sumber