ATAU tidak didukung dengan Pernyataan KASUS di SQL Server

572

The ORoperator di WHENklausa dari CASEpernyataan tidak didukung. Bagaimana saya bisa melakukan ini?

CASE ebv.db_no 
    WHEN 22978 OR 23218 OR 23219 THEN 'WECS 9500' 
    ELSE 'WECS 9520' 
END as wecs_system 
Werner
sumber
SQL Standard memungkinkan untuk beberapa nilai: stackoverflow.com/a/54562580/5070879
Lukasz Szozda

Jawaban:

1079

Format itu mengharuskan Anda untuk menggunakan:

CASE ebv.db_no 
  WHEN 22978 THEN 'WECS 9500' 
  WHEN 23218 THEN 'WECS 9500'  
  WHEN 23219 THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 

Jika tidak, gunakan:

CASE  
  WHEN ebv.db_no IN (22978, 23218, 23219) THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 
OMG Ponies
sumber
9
Untuk kasus kedua, mengapa hanya 'IN' berfungsi dan tidak '='?
Han
25
=akan bekerja jika Anda membandingkan dengan nilai tunggal. Namun, (22978, 23218, 23219)adalah array dan INdiperlukan untuk mencocokkan hanya satu dari nilai-nilai.
LdTrigger
2
Sql ini benar-benar bau tidak bisa menangani "atau" dalam pernyataan kasus. Ayo Microsoft waktu untuk tumbuh dari status basis data mainan.
Rich Bianco
1
"tidak dapat menangani" atau "dalam pernyataan kasus" .. hmmm .... saya rasa saya belum pernah melihat saklar menerima "atau" dalam bahasa apa pun. tampaknya akan mengalahkan tujuan saklar. bahasa apa yang menerima "atau" dalam sebuah kasus?
Heriberto Lugo
2
@Heriberto Lugo Saya tidak tahu berapa banyak bahasa yang Anda tahu tetapi setidaknya ada beberapa. VB.NET dan C # dapat menggunakannya dengan pemisahan koma sederhana. Itu tidak mengalahkan apa pun karena itu akan menyelamatkan Anda dari pengulangan kode yang sama dalam banyak kasus tanpa biaya.
Johnny Prescott
249
CASE
  WHEN ebv.db_no = 22978 OR 
       ebv.db_no = 23218 OR
       ebv.db_no = 23219
  THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 
Darren
sumber
38
terbalik - respons ini memang menambah nilai. Ini lebih dekat dengan pertanyaan OP, dan jika Anda ingin membuat beberapa CASE-WHENS sintaks ini mengurangi kode yang diperlukan.
Matt Kemp
1
@Leigh Saya menghargai jawaban ini. Sangat menyenangkan memiliki semua format berbeda dalam satu utas dan menjadikannya lebih bermanfaat sebagai referensi.
Jason Wheeler
3
@Bigwheels - Wow .. ini beberapa waktu yang lalu. Saya mungkin tidak setuju karena, secara logis, persis sama dengan respons lainnya . Yang mengatakan, Anda dan Matt membuat poin yang valid. Jika pertanyaannya adalah "apa sintaks yang benar hanya menggunakan ATAU ", ini memberikan jawaban. Namun, jika "mengurangi sintaksis yang diperlukan" adalah tujuannya, respons yang diterima lebih kompak. BTW, itu tidak membanting jawaban Darren, yang sangat valid. Hanya $ 0,02 saya :)
Leigh
2
menggunakan INkata kunci jauh lebih baik
Sagar Naliyapara
57
CASE WHEN ebv.db_no  IN (22978, 23218, 23219) THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 
Cade Roux
sumber
53

Anda dapat menggunakan salah satu ekspresi yang dimiliki WHEN, tetapi Anda tidak dapat mencampur keduanya.

  1. WHEN when_expression

    Merupakan ekspresi sederhana yang dibandingkan dengan input_expression saat format KASUS sederhana digunakan. when_expression adalah ekspresi yang valid. Jenis data input_expression dan masing-masing when_expression harus sama atau harus konversi implisit.

  2. KAPAN Boolean_expression

    Apakah ekspresi Boolean dievaluasi saat menggunakan format KASUS yang dicari. Boolean_expression adalah ekspresi Boolean yang valid.

Anda dapat memprogram:

1.

    CASE ProductLine
            WHEN 'R' THEN 'Road'
            WHEN 'M' THEN 'Mountain'
            WHEN 'T' THEN 'Touring'
            WHEN 'S' THEN 'Other sale items'
            ELSE 'Not for sale'

2.

    CASE
            WHEN ListPrice =  0 THEN 'Mfg item - not for resale'
            WHEN ListPrice < 50 THEN 'Under $50'
            WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
            WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
            ELSE 'Over $1000'
          END

Tetapi bagaimanapun Anda dapat mengharapkan bahwa peringkat variabel akan dibandingkan dalam ekspresi boolean.

Lihat KASUS (Transact-SQL) (MSDN).

Alfaplus
sumber
37

Sudah ada banyak jawaban sehubungan dengan CASE. Saya akan menjelaskan kapan dan bagaimana cara menggunakannya CASE.

Anda bisa menggunakan ekspresi KASUS di mana saja di kueri SQL. Ekspresi KASUS dapat digunakan dalam pernyataan SELECT, WHERE clauses, Order by clause, HAVING clauses, Insert, UPDATE, dan DELETE.

Ekspresi CASE memiliki dua format berikut:

  1. Ekspresi KASUS sederhana

    CASE expression
    WHEN expression1 THEN Result1
    WHEN expression2 THEN Result2
    ELSE ResultN
    END

    Ini membandingkan ekspresi dengan serangkaian ekspresi sederhana untuk menemukan hasilnya. Ekspresi ini membandingkan ekspresi dengan ekspresi dalam setiap klausa KAPAN untuk ekivalensi. Jika ekspresi dalam klausa KETIKA cocok, ekspresi dalam klausa KEMUDIAN akan dikembalikan.

    Di sinilah pertanyaan OP jatuh. 22978 OR 23218 OR 23219tidak akan mendapatkan nilai yang sama dengan ekspresi yaitu ebv.db_no. Itu sebabnya memberikan kesalahan. Jenis data input_expression dan masing-masing when_expression harus sama atau harus konversi implisit.

  2. Ekspresi KASUS yang dicari

    CASE
    WHEN Boolean_expression1 THEN Result1
    WHEN Boolean_expression2 THEN Result2
    ELSE ResultN
    END

    Ekspresi ini mengevaluasi sekumpulan ekspresi boolean untuk menemukan hasilnya. Ekspresi ini memungkinkan operator pembanding, dan operator logika AND / OR dengan dalam setiap ekspresi Boolean.

1. SELECT pernyataan dengan ekspresi KASUS

--Simple CASE expression: 
SELECT FirstName, State=(CASE StateCode
 WHEN 'MP' THEN 'Madhya Pradesh' 
 WHEN 'UP' THEN 'Uttar Pradesh' 
 WHEN 'DL' THEN 'Delhi' 
 ELSE NULL 
 END), PayRate
FROM dbo.Customer

-- Searched CASE expression:
SELECT FirstName,State=(CASE 
 WHEN StateCode = 'MP' THEN 'Madhya Pradesh' 
 WHEN StateCode = 'UP' THEN 'Uttar Pradesh' 
 WHEN StateCode = 'DL' THEN 'Delhi' 
 ELSE NULL 
 END), PayRate
FROM dbo.Customer

2. Perbarui pernyataan dengan ekspresi KASUS

-- Simple CASE expression: 
UPDATE Customer 
SET StateCode = CASE StateCode
 WHEN 'MP' THEN 'Madhya Pradesh' 
 WHEN 'UP' THEN 'Uttar Pradesh' 
 WHEN 'DL' THEN 'Delhi' 
 ELSE NULL 
 END 

-- Simple CASE expression: 
UPDATE Customer 
SET StateCode = CASE 
 WHEN StateCode = 'MP' THEN 'Madhya Pradesh' 
 WHEN StateCode = 'UP' THEN 'Uttar Pradesh' 
 WHEN StateCode = 'DL' THEN 'Delhi' 
 ELSE NULL 
 END 

3.ORDER BY klausa dengan ekspresi KASUS

-- Simple CASE expression: 
SELECT * FROM dbo.Customer
ORDER BY 
 CASE Gender WHEN 'M' THEN FirstName END Desc,
 CASE Gender WHEN 'F' THEN LastName END ASC

-- Searched CASE expression: 
SELECT * FROM dbo.Customer
ORDER BY 
 CASE WHEN Gender='M' THEN FirstName END Desc,
 CASE WHEN Gender='F' THEN LastName END ASC

4.Memiliki Klausa dengan ekspresi KASUS

-- Simple CASE expression: 
SELECT FirstName ,StateCode,Gender, Total=MAX(PayRate)
FROM dbo.Customer
GROUP BY StateCode,Gender,FirstName
HAVING (MAX(CASE Gender WHEN 'M' 
 THEN PayRate 
 ELSE NULL END) > 180.00
 OR MAX(CASE Gender WHEN 'F' 
 THEN PayRate 
 ELSE NULL END) > 170.00)

-- Searched CASE expression: 
SELECT FirstName ,StateCode,Gender, Total=MAX(PayRate)
FROM dbo.Customer
GROUP BY StateCode,Gender,FirstName
HAVING (MAX(CASE WHEN Gender = 'M' 
 THEN PayRate 
 ELSE NULL END) > 180.00
 OR MAX(CASE WHEN Gender = 'F' 
 THEN PayRate 
 ELSE NULL END) > 170.00)

Semoga kasus penggunaan ini akan membantu seseorang di masa depan.

Sumber

Somnath Muluk
sumber
34

Mencoba

CASE WHEN ebv.db_no IN (22978,23218,23219) THEN 'WECS 9500' ELSE 'WECS 9520' END
JNK
sumber
28
SELECT
  Store_Name,
  CASE Store_Name
    WHEN 'Los Angeles' THEN Sales * 2
    WHEN 'San Diego' THEN Sales * 1.5
    ELSE Sales
    END AS "New Sales",
  Txn_Date
FROM Store_Information;
Archu
sumber
1
Dipilih karena dimasukkannya ELSE Salesbidang, yang mengembalikan nilai default jika tidak dimasukkan dalam pernyataan kasus, sesuai untuk permintaan bisnis.
FoxDeploy
3
select id,phno,case gender
when 'G' then 'M'
when 'L' then 'F'
else
'No gender'
end
as gender 
from contacts
Debendra Dash
sumber
1
Mengapa Anda tidak menjelaskan apa yang sedang dilakukan di sini? Penting untuk memberikan jawaban lengkap dengan Penjelasan karena beberapa pemula mungkin membutuhkan itu untuk memahami bagaimana ini memecahkan masalah
Gerhard Barnard
3
UPDATE table_name 
  SET column_name=CASE 
WHEN column_name in ('value1', 'value2',.....) 
  THEN 'update_value' 
WHEN column_name in ('value1', 'value2',.....) 
  THEN 'update_value' 
END

table_name = Nama tabel di mana Anda ingin melakukan operasi.

column_name = Nama Kolom / Bidang nilai yang ingin Anda atur.

update_value = Nilai yang ingin Anda atur column_name

Anand agrawal
sumber
11
Meskipun kode ini dapat menyelesaikan masalah OP, beberapa kata penjelasan akan lebih bermanfaat bagi pembaca di masa mendatang.
Thom
-5
Select s.stock_code,s.stock_desc,s.stock_desc_ar,
mc.category_name,s.sel_price,
case when s.allow_discount=0 then 'Non Promotional Item' else 'Prmotional 
item' end 'Promotion'
From tbl_stock s inner join tbl_stock_category c on s.stock_id=c.stock_id
inner join tbl_category mc on c.category_id=mc.category_id
where mc.category_id=2 and s.isSerialBased=0 
Mohammad Shahnawaz
sumber
1
Jawaban ini sepertinya tidak ada hubungannya dengan pertanyaan.
LarsTech
4
Tolong jangan memposting kode telanjang, juga berikan penjelasan tentang apa yang kode Anda lakukan.
Jonathan Mee