ChatGPT解决这个技术问题 Extra ChatGPT

SQL Server 中的 CASE 语句不支持 OR

不支持 CASE 语句的 WHEN 子句中的 OR 运算符。我怎样才能做到这一点?

CASE ebv.db_no 
    WHEN 22978 OR 23218 OR 23219 THEN 'WECS 9500' 
    ELSE 'WECS 9520' 
END as wecs_system 
SQL 标准允许多个值:stackoverflow.com/a/54562580/5070879

O
OMG Ponies

该格式要求您使用:

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 

否则,使用:

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

对于第二种情况,为什么只有'IN'起作用而'='不起作用?
如果您要与单个值进行比较,= 会起作用。但是,(22978, 23218, 23219) 是一个数组,IN 是仅匹配其中一个值所必需的。
这真的很臭 - t-sql 无法处理 case 语句中的“或”。快来微软从玩具数据库的地位成长起来吧。
“无法处理案例语句中的“或””.. 嗯....我认为我从未见过开关接受任何语言的“或”。似乎会破坏开关的目的。在一个案例中,哪些语言接受“或”?
@Heriberto Lugo 我不知道您知道多少种语言,但至少有几种。 VB.NET 和 C# 可以通过简单的逗号分隔来使用它们。它不会破坏任何东西,因为它可以让您免于在多种情况下重复相同的代码。
A
Amarnath Balasubramanian
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 

赞成 - 此响应确实增加了价值。它更符合 OP 的问题,如果你想嵌套一些 CASE-WHENS,这种语法会大大减少必要的代码。
@Leigh 我很欣赏这个答案。在一个线程中包含所有不同的格式并使其更可用作参考是很好的。
@Bigwheels - 哇..这是不久前的事了。我可能不同意,因为从逻辑上讲,它与 other responses 完全相同。也就是说,你和马特提出了有效的观点。如果问题是“使用 OR only 的正确语法是什么”,这提供了一个答案。但是,如果“减少必要的语法”是目标,则 accepted response 更紧凑。顺便说一句,这不是对达伦的回答的抨击,这是完全有效的。只是我的 0.02 美元 :)
使用 IN 关键字是更好的方法
O
Osama Rizwan
CASE WHEN ebv.db_no IN (22978, 23218, 23219) THEN 'WECS 9500' 
 ELSE 'WECS 9520' 
END as wecs_system 

P
Peter Mortensen

您可以使用 WHEN 具有的表达式之一,但不能将它们混合使用。

WHEN when_expression 是一个简单表达式,在使用简单 CASE 格式时将 input_expression 与它进行比较。 when_expression 是任何有效的表达式。 input_expression 和每个 when_expression 的数据类型必须相同或者必须是隐式转换。 WHEN Boolean_expression 是使用搜索的 CASE 格式时计算的布尔表达式。 Boolean_expression 是任何有效的布尔表达式。

你可以编程:

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

但在任何情况下,您都可以期望变量排名将在布尔表达式中进行比较。

请参阅 CASE (Transact-SQL) (MSDN)。


P
Peter Mortensen

关于CASE,已经有很多答案了。我将解释何时以及如何使用 CASE

您可以在 SQL 查询中的任何位置使用 CASE 表达式。 CASE 表达式可以在 SELECT 语句、WHERE 子句、Order by 子句、HAVING 子句、Insert、UPDATE 和 DELETE 语句中使用。

CASE 表达式有以下两种格式:

简单 CASE 表达式 CASE 表达式 WHEN 表达式1 THEN Result1 WHEN 表达式2 THEN Result2 ELSE ResultN END 这将一个表达式与一组简单表达式进行比较以查找结果。此表达式将一个表达式与每个 WHEN 子句中的表达式进行比较,以获得等效性。如果 WHEN 子句中的表达式匹配,则返回 THEN 子句中的表达式。这就是OP的问题所在。 22978 OR 23218 OR 23219 不会得到等于表达式的值,即 ebv.db_no。这就是它给出错误的原因。 input_expression 和每个 when_expression 的数据类型必须相同或者必须是隐式转换。搜索的 CASE 表达式 CASE WHEN Boolean_expression1 THEN Result1 WHEN Boolean_expression2 THEN Result2 ELSE ResultN END 此表达式计算一组布尔表达式以查找结果。此表达式允许在每个布尔表达式中使用比较运算符和逻辑运算符 AND/OR。

1.带有CASE表达式的SELECT语句

--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.用CASE表达式更新语句

-- 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表达式的ORDER BY子句

-- 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.Having子句与CASE表达式

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

希望这个用例能在将来对某人有所帮助。

Source


d
davmos

尝试

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

K
Kristian
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;

由于包含 ELSE Sales 字段而投票赞成,如果 case 语句中未包含其他字段,该字段将返回默认值,适用于业务查询。
D
Debendra Dash
select id,phno,case gender
when 'G' then 'M'
when 'L' then 'F'
else
'No gender'
end
as gender 
from contacts

你为什么不解释这里正在做什么?用解释给出完整的答案很重要,因为一些新手可能需要这样才能理解这是如何解决问题的
A
Anand agrawal
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 = 您要对其执行操作的表的名称。

column_name = 要设置的值的列/字段的名称。

update_value = 您要设置的值 column_name


虽然这段代码可能会解决 OP 的问题,但几句话的解释将对未来的读者更有帮助。
k
krissemicolon
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 

M
Mohammad Shahnawaz
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 

这个答案看起来与问题无关。
请不要发布裸代码,同时解释您的代码在做什么。