我有一个可以使用SQL Server或MS Access作为数据存储的项目。在一个SELECT语句中,我必须对单个列和单个值执行COALESCE操作,如下所示:
SELECT COALESCE([Amount], 0) FROM PaymentsDue;
我想编写一个SQL语句,它将在SQL Server和MS Access中正确执行。直接感兴趣的SQL Server版本是2008,尽管适用于不同版本的解决方案将是首选。
今天早些时候,有人能够to show me an SQL trick允许我使用单个SELECT语句来有效地将DATETIME CAST到DATE。我想知道是否有人有类似的技巧以可以应用于 SQL Server和MS Access的方式执行COALESCE(例如,IFNULL或NZ)操作?
答案 0 :(得分:7)
我认为在两个平台上都没有任何相同功能的语法。
注意Nz()
仅在使用Access用户界面时可用。
以下是一些可以很容易地转换为COALESCE
的建议,虽然重复列很痛苦:
样本1:
SELECT IIF([Amount] IS NULL, 0, [Amount]) FROM PaymentsDue;
样本2:
SELECT SWITCH([Amount] IS NULL, 0, TRUE, [Amount]) FROM PaymentsDue;
答案 1 :(得分:6)
这会有效,但它很笨重:
SELECT Amount
FROM PaymentsDue
WHERE Amount IS NOT NULL
UNION ALL
SELECT 0 AS Amount
FROM PaymentsDue
WHERE Amount IS NULL
显然,如果您有多个列,这很快就会无法管理。
答案 2 :(得分:4)
在模块中创建自定义公共函数。
Public Function COALESCE(InputValue, ValueIfNull)
COALESCE = nz(InputValue, ValueIfNull)
End Function
添加错误处理等,进行改进。
现在,您可以在MS Access和SQL中使用COALESCE
函数。
答案 3 :(得分:0)
我想你不想编写一个解析器来管理Jet SQL和T-SQL之间的翻译......
我们开发的解决方案(是的,我们有一个类似的问题要解决)是定义我们在meta-SQL语法中使用的一些'伪元语言',我们有一种来自这种元语言的翻译器到Jet SQL或T-SQL。
示例:
myQuery = "SELECT @MyCoalesceFunction@([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 @CarSep@ABC@MyWildCard@@CarSep@"
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%""
我知道它不是那么好,但它非常高效和干净。要点是: