2011-10-27 111 views
7

我有一個可以使用SQL Server或MS Access作爲數據存儲的項目。在一個SELECT語句,我必須對單個列和單個值執行COALESCE操作,像這樣:可用於SQL Server和MS Access的COALESCE,IFNULL或NZ()函數

SELECT COALESCE([Amount], 0) FROM PaymentsDue; 

我想編寫,將SQL Server和MS訪問正確地執行一個SQL語句。即時感興趣的SQL Server版本是2008年,儘管適用於不同版本的解決方案將是首選。

今天早些時候,有人能夠to show me an SQL trick,允許我使用單個SELECT語句有效地將DATETIME CAST到DATE。我想知道是否有人可以應用這兩種 SQL Server和MS Access執行COALESCE(例如,IFNULL或NZ)操作的類似技巧?

回答

6

這是可行的,但它是笨重:

SELECT Amount 
FROM PaymentsDue 
WHERE Amount IS NOT NULL 
UNION ALL 
SELECT 0 AS Amount 
FROM PaymentsDue 
WHERE Amount IS NULL 

顯然,如果你有一個以上的列,此獲取要迅速失控。

+1

的'金額= 0'部分將不訪問工作。它應該是'0 AS Amount'。 –

+0

我去了這個解決方案的變種。我的直接需求是執行一個INSERT。 。 。選擇。 。我只是簡單地重複這個語句兩次,一次是NULL,一次是其他行。 –

5

我不認爲在兩個平臺上都有相同的語法。

注意Nz()僅在使用Access用戶界面時可用。

這裏有一些建議,可以相當容易地轉化爲COALESCE,雖然重複該列是疼痛:

樣品1:

SELECT IIF([Amount] IS NULL, 0, [Amount]) FROM PaymentsDue; 

樣品2:

SELECT SWITCH([Amount] IS NULL, 0, TRUE, [Amount]) FROM PaymentsDue; 
0

我想你不想寫一個解析器來管理Jet SQL和T-SQL之間的翻譯......

我們開發的解決方案(是的,我們遇到類似的問題需要解決)是定義一些我們在meta-SQL語法中使用的'僞元語言',並且我們有一種這種元語言的翻譯器轉換爲Jet SQL或T-SQL。

例子:

myQuery = "SELECT @[email protected]([Amount], 0) FROM PaymentsDue;" 

myQuery = convertFromMeta(myQuery,"T-SQL") 
will give 
    "SELECT COALESCE([Amount], 0) FROM PaymentsDue;" 

myQuery = convertFromMeta(myQuery,"JET-SQL") 
will give 
    "SELECT NZ([Amount], 0) FROM PaymentsDue;" 

同樣的策略可用於通配符和分隔符:

myQuery = "SELECT [Amount] FROM PaymentsDue WHERE id_client LIKE @[email protected]@[email protected]@[email protected]" 

myQuery = convertFromMeta(myQuery,"T-SQL") 
will give 
    "SELECT [Amount] FROM PaymentsDue WHERE id_client LIKE 'ABC%'" 

myQuery = convertFromMeta(myQuery,"JET-SQL") 
will give 
    "SELECT [Amount] FROM PaymentsDue WHERE id_client LIKE "ABC%"" 

我konw這不是很好,但它是相當高效和清潔。要點如下:

  • 我們不是在Jet和T-SQL之間進行翻譯,而是從'元語法'進行翻譯。它使事情變得更容易
  • 當函數沒有相同數量的參數或參數未按相同順序傳遞時,應該非常小心。它仍然可以做...
  • 我們的元語法依賴於相應的字符串(比如'@ MyWildCard @'或'@ CarSep @')是特定於我們的語法的事實,並且不能用作數據值(否則我們將不得不管理一些'元注入'風險!...)
+0

你是對的,我不想寫我自己的解析器!但是,我曾經想過編寫我自己的* generator *,但是,按照您的建議(但是使用對象而不是字符串)進行操作。在我的應用程序的另一部分中,我發出DDL來向數據庫添加新功能,這些功能必須針對引擎;這將受益於(並且相對容易)使用發電機。如果我這樣做了,我可以在每個引擎的不同視圖中封裝我的SELECT邏輯。但是,這是在未來,現在我正在尋找一個快速的「技巧」來處理這個特定的問題。 –

3

創建一個模塊在一個自定義的公共職能。

Public Function COALESCE(InputValue, ValueIfNull) 
    COALESCE = nz(InputValue, ValueIfNull) 
End Function 

加入錯誤處理等,進行改進。現在

,你將能夠使用COALESCE功能在MS Access和SQL。