OR, SQL Server'daki CASE Deyimi ile desteklenmez


Yanıtlar:


1079

Bu biçim şunlardan birini kullanmanızı gerektirir:

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 

Aksi takdirde şunu kullanın:

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

9
İkinci durumda, neden '=' değil, sadece 'IN' çalışır?
Han

25
=tek bir değerle karşılaştırırsanız işe yarar. Ancak, (22978, 23218, 23219)bir dizidir ve INdeğerlerden yalnızca biriyle eşleşmesi gerekir.
LdTrigger

2
Bu gerçekten kötü-t-sql bir vaka deyiminde bir "veya" işleyemez. Oyuncak veritabanı durumundan büyümek için Microsoft zamanı gel.
Zengin Bianco

1
"işleyemiyorum" veya "bir vaka deyiminde" .. hmmm .... ive sanırım hiç bir anahtar kabul etmek kabul "veya" herhangi bir dilde. bir anahtarın amacını bozuyor gibi görünüyor. bir durumda hangi diller "veya" kabul edilir?
Heriberto Lugo

2
@Heriberto Lugo Kaç dil bildiğini bilmiyorum ama en az birkaç dil var. VB.NET ve C # bunları basit virgülle ayırma ile kullanabilir. Hiçbir şey için aynı kodu birden fazla durumda tekrarlamaktan kurtaracağı için hiçbir şeyi yenmez.
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 

38
upvoted - bu yanıt değer katar. OP'nin sorusuna daha çok uyuyor ve bazı CASE-WHENS'leri yuvalamak istiyorsanız, bu sözdizimi gerekli kodu önemli ölçüde azaltır.
Matt Kemp

1
@ Cevap bu cevabı takdir ediyorum. Tüm farklı formatları tek bir iş parçacığına sahip olmak güzel ve referans olarak daha kullanışlı hale getirir.
Jason Wheeler

3
@Bigwheels - Vay be ... bu bir süre önceydi. Muhtemelen katılmıyorum çünkü mantıklı olarak, diğer yanıtlarla tamamen aynı . Bununla birlikte, Matt ve siz geçerli puanlar verdiniz. Soru " yalnızca VEYA'yı kullanarak doğru sözdizimi nedir " ise, bu bir yanıt sağlar. Ancak, hedef "gerekli sözdizimini azaltmak" ise, kabul edilen yanıt daha küçüktür. BTW, Darren'ın cevabında bir slam değil, ki bu tamamen geçerli. Sadece benim 0,02 $ :)
Leigh

2
INanahtar kelime kullanmak çok daha iyi bir yoldur
Sagar Naliyapara

57
CASE WHEN ebv.db_no  IN (22978, 23218, 23219) THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 

53

NE ZAMAN olan ifadelerden birini kullanabilirsiniz, ancak ikisini birden karıştıramazsınız.

  1. WHEN Instagram Hesabındaki Resim ve Videoları when_expression

    Basit CASE formatı kullanıldığında input_expression komutunun karşılaştırıldığı basit bir ifadedir. when_expression herhangi bir geçerli ifadedir. İnput_expression ve her when_expression veri türleri aynı veya örtük bir dönüşüm olmalıdır.

  2. WHEN Boolean_expression

    Aranan CASE biçimi kullanılırken Boole ifadesi değerlendirilir mi? Boolean_expression geçerli herhangi bir Boolean ifadesidir.

Programlayabilirsiniz:

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

Ancak her durumda, değişken sıralamasının bir boole ifadesinde karşılaştırılmasını bekleyebilirsiniz.

Bkz. CASE (Transact-SQL) (MSDN).


37

Bununla ilgili zaten birçok cevap var CASE. Ne zaman ve nasıl kullanılacağını açıklayacağım CASE.

CASE ifadelerini SQL sorgularının herhangi bir yerinde kullanabilirsiniz. CASE ifadeleri SELECT ifadesi, WHERE yan tümcesi, yan tümce sıralaması, HAVING yan tümcesi, Insert, UPDATE ve DELETE ifadeleri içinde kullanılabilir.

Bir CASE ifadesi aşağıdaki iki biçime sahiptir:

  1. Basit CASE ifadesi

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

    Bu, sonucu bulmak için bir ifadeyi bir dizi basit ifadeyle karşılaştırır. Bu ifade, bir ifadeyi eşdeğerlik için her WHEN yan tümcesindeki ifadeyle karşılaştırır. WHEN yan tümcesi içindeki ifade eşleşirse, THEN yan tümcesindeki ifade döndürülür.

    OP'nin sorusu bu noktada düşüyor. 22978 OR 23218 OR 23219ebv.db_no ifadesine eşit bir değer elde etmez. Bu yüzden bir hata veriyor. İnput_expression ve her when_expression veri türleri aynı veya örtük bir dönüşüm olmalıdır.

  2. Aranan CASE ifadeleri

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

    Bu ifade, sonucu bulmak için bir dizi boole ifadesini değerlendirir. Bu ifade, her bir Boole ifadesinde karşılaştırma işleçlerine ve AND / OR mantıksal işleçlerine izin verir.

1. CASE ifadeleri ile SELECT deyimi

--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

CASE ifadesi ile ifade güncelleme

-- 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. CASE ifadeleriyle ORDER BY yan tümcesi

-- 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

CASE ifadesi ile 4.Fıkra

-- 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)

Umarım bu kullanım vakaları gelecekte birine yardımcı olur.

Kaynak


34

Deneyin

CASE WHEN ebv.db_no IN (22978,23218,23219) THEN 'WECS 9500' ELSE 'WECS 9520' END

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;

1
Vaka bildirisine ELSE Salesbaşka bir şekilde dahil edilmemişse varsayılan değerleri döndüren ve iş sorguları için uygun olan bir alanın dahil edilmesi nedeniyle yukarı oylama .
FoxDeploy

3
select id,phno,case gender
when 'G' then 'M'
when 'L' then 'F'
else
'No gender'
end
as gender 
from contacts

1
Neden burada ne yapıldığını açıklamıyorsunuz? Bazı yeni başlayanların bunun sorunu nasıl çözdüğünü anlamak için buna ihtiyaç duyabileceğinden Açıklamalara tam cevap vermek önemlidir
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 = İşlem yapmak istediğiniz tablonun adı.

column_name = Ayarlamak istediğiniz sütunun / alanın adı.

update_value = Ayarlamak istediğiniz değer column_name


11
Bu kod OP'nin sorununu çözse de, birkaç açıklama kelimesi gelecekteki okuyucular için daha da yararlı olacaktır.
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 

1
Bu cevap, onun soru ile ilgisi yok gibi görünüyor.
LarsTech

4
Lütfen çıplak kod göndermeyin, ayrıca kodunuzun ne yaptığını açıklayın.
Jonathan Mee
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.