有沒有辦法重寫一個使用CASE WHEN結構來做同樣的事情而不使用CASE WHEN的Transact SQL語句?SQL Server CASE什麼時候不使用CASE什麼時候
我正在使用具有內置查詢設計器和自己的僞SQL的產品。它對我可以用於SQL Server和Oracle的內容有限制。所以我有這個專欄,當底層數據庫是Oracle時,使用DECODE(這是支持的)。但是,我需要使它與SQL Server和CASE WHEN不受支持一起使用。
我想轉換的說法是一樣的東西
Decode (StatusColumn, 'Value 1',
Decode(Sign(Now()-TargetDateColumn)),1,'Past
Due', 'Outstanding'), 'Value 2',
Decode(Sign(Now()-TargetDateColumn)),1,'Past
Due', 'Outstanding'), 'Value 3',
Decode(Sign(Now()-TargetDateColumn)),1,'Past
Due', 'Outstanding'), 'Value 4')
我有一組有限的T-SQL選項使用和CASE WHEN是不是一種選擇。我確實有IsNull和Coalesce,但我不確定他們是否會幫助我。
不要打擾日期計算,這些都解決了。
我在這裏搜索了CASE WHEN問題,無濟於事。
謝謝!
更新:
我意識到,我應該給更多的細節上的限制的原因,因爲這是一個開發人員的資源,那麼可以斷定,這是一個發展的產物。不是這樣。
我正在使用具有內置查詢設計器和自己的僞SQL的企業軟件產品。它對我可以用於SQL Server和Oracle的內容有限制。基本上,不會破壞內置查詢引擎解析的所有內容都是遊戲。這意味着所有被批准的函數和表達式以及所有數據抽象(與數據庫中的物理表對應的內部對象以及使用該產品創建的其他查詢)以及Oracle SQL或Transact SQL中沒有明確地破壞解析的所有內容。
CASE WHEN不適用於我的原因是它破壞了查詢引擎對僞SQL的解析。
最後,我想嘗試:
- 只能使用該產品的查詢 設計師從 的SQL Server數據庫和經過 解析或
- 使用一些額外的資源,SQL 查詢設計器完成它。
基於我得到的幾個很好的答案,以下是迄今爲止爲我制定的方法。
Jason DeFontes建議我可以使用數據庫視圖來執行CASE WHEN規則並落入上述#2中。它適用於我,因爲視圖足夠動態,所以我不必對其進行維護(與richartallent的真值表方法相反,我相信它接近Jason的方法)。帕斯卡建議創建一個函數將沿着同樣的路線走,但可能會打破解析。
因此,我創建了一個數據庫視圖,用CASE WHEN完成所有轉換,並將其添加到查詢的SQL中,並將其與現有SQL一起加入,並且工作得很好。我意識到我可能會向數據庫引擎添加開銷,因爲它必須兩次檢索相同的數據集(一個用於查看,一個用於查詢),但這是一個幾乎不成問題的情況之一。
鑑於這種「使用視圖來混淆它」的設計工作對我來說,我不知道這將是更有效的方法:
- 使用選擇與CASE WHEN;
- 使用CTE(再次,richardtallent);
- 使用Union All(HLGEM);
- 使用子查詢(MisterZimbu);
我仍然會檢查Aramis wyler的建議,因爲它可能會落入上面的#1。
現在,傑森的答案被接受了。考慮到我在視圖中使用了CASE WHEN,或許這個問題的標題最終被錯誤地選擇了。我提高了每個人都提出了一些有助於這一進程的內容。我不知道這是否會影響你的聲譽,但我認爲這是一件好事。
再一次,我要感謝大家的幫助,並且請您編輯關於您不合適的問題(這是我的第一個問題,英語是我的第二語言)。
我很好奇..爲什麼你沒有選擇使用Case When?貴公司是否制定了這樣的政策?!!?不管你有外部授權限制,Case When在SQL Server上肯定受支持。 – 2009-11-05 18:07:36
是的,但查詢工具可能不支持它,將選擇結果限制爲表達式和函數調用。 – pascal 2009-11-05 18:11:19
這是我們正在開發的產品的限制。正如我所提到的那樣,該產品有一個查詢設計器和一個查詢引擎,以及它自己的SQL,可以將其「翻譯」/「充分」到Oracle或SQL Server中。 我懷疑是否支持解碼,因爲它是一個函數,不管我被告知Case-When不是一個函數,而是一個表達式。 我認爲Case-When會由於僞SQL定義而中斷查詢引擎的解析。 – ezingano 2009-11-05 18:14:18