Sql-Server

使用 SELECT 列表中的表達式來精簡 CASE 語句

  • August 27, 2014

我有一個正在重寫的查詢 - 它在列表中有一大堆語句caseselect基本上看起來像這樣:

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(returns 0) 的事情,但它似乎在解析選擇列表 ( 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 更整潔,但您可能會更普遍地降低程式碼的清晰度(和效率,儘管如果您仔細編寫函式,查詢規劃器將展開它們以減少這種影響)。

引用自:https://dba.stackexchange.com/questions/75073