可以在SQL Server和MS Access中使用的COALESCE,IFNULL或NZ()函数

时间:2011-10-27 01:31:14

标签: sql sql-server ms-access coalesce

我有一个可以使用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)操作?

4 个答案:

答案 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%""

我知道它不是那么好,但它非常高效和干净。要点是:

  • 我们不是在Jet和T-SQL之间进行翻译,而是从“元语法”进行翻译。它使事情变得容易很多
  • 当函数没有相同数量的参数,或者参数不以相同的顺序传递时,应该非常小心。它仍然可以做......
  • 我们的元语法依赖于以下事实:相应的字符串(如'@ MyWildCard @'或'@ CarSep @')特定于我们的语法,不能用作数据值(否则我们必须管理一些'meta-injection'风险!......)