Sql-Server
使用 SELECT 列表中的表達式來精簡 CASE 語句
我有一個正在重寫的查詢 - 它在列表中有一大堆語句
case
,select
基本上看起來像這樣:select Column1 = case when (Something = 2) and (SomethingElse is null) and (AnotherThing in (1, 2)) then 1 else 0 end, Column2 = case when (Something = 3) and (SomethingElse is not null) and (AnotherThing in (2, 3)) then 1 else 0 end, ...
特別注意
when <expressions> then 1 else 0
所有這些共同的“”邏輯。看起來真的很臃腫而且冗長,是對語句的粗暴使用——我的程式大腦告訴我,這可以通過一些基本的 binary ing 邏輯
case
更簡潔地實現,完全刪除:&``case
select Column1 = (Something = 2) & (SomethingElse is null) & (AnotherThing in (1, 2)), Column2 = (Something = 3) & (SomethingElse is not null) & (AnotherThing in (2, 3)), ...
不幸的是,雖然 SQL Server 能夠處理類似
select 1 & 0
(returns0
) 的事情,但它似乎在解析選擇列表 (Incorrect syntax near '='
) 中的表達式時窒息 - 可以做這樣的事情嗎?某種評估函式,也許吧?
T-SQL 不支持這樣的布爾值。但是您可以將 CROSS APPLY 與使用 CASE 生成一堆 1 和 0 的子查詢一起使用,然後使用按位運算符 & 和 | 將它們組合在 SELECT 子句中。
不幸的是,您不會在這裡真正繞過 SQL 的冗長。
你可以編寫一個函式(函式族)來減少查詢中的文本量,所以你有類似的東西:
select Column1 = dbo.YeyOrNay(Something, 2, SomethingElse, 1, AnotherThing, 1, 2), Column2 = dbo.YeyOrNay(Something, 3, SomethingElse, 0, AnotherThing, 2, 3), ...
要麼
select Column1 = dbo.Col1Func(Something, SomethingElse, AnotherThing), Column2 = dbo.col2Func(Something, SomethingElse, AnotherThing), ...
但是,雖然這使 SELECT 更整潔,但您可能會更普遍地降低程式碼的清晰度(和效率,儘管如果您仔細編寫函式,查詢規劃器將展開它們以減少這種影響)。