10

我有一个项目可以使用 SQL Server 或 MS Access 作为数据存储。在一个 SELECT 语句中,我必须对单个列和单个值执行 COALESCE 操作,如下所示:

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

我想编写一个可以在 SQL Server 和 MS Access 中正确执行的 SQL 语句。最受关注的 SQL Server 版本是 2008 年,但更喜欢跨版本适用的解决方案。

今天早些时候,有人向我展示了一个 SQL 技巧,它允许我使用单个 SELECT 语句来有效地将 DATETIME 转换为 DATE。我想知道是否有人有类似的技巧以可以应用于SQL Server 和 MS Access的方式执行 COALESCE(例如,IFNULL 或 NZ)操作?

4

4 回答 4

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;
于 2011-10-27T09:17:12.577 回答
6

这会起作用,但它很笨重:

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

显然,如果您有多个列,这将很快变得难以管理。

于 2011-10-27T03:12:45.283 回答
5

在模块中创建自定义公共函数。

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

加入错误处理等,进行改进。

现在,您将能够COALESCE在 MS Access 和 SQL 中使用该功能。

于 2012-08-17T20:21:46.013 回答
0

而且我猜你不想编写一个解析器来管理 Jet SQL 和 T-SQL 之间的翻译......

我们开发的一个解决方案(是的,我们有一个类似的问题要解决)是定义一些我们在元 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-注射的风险!...)
于 2011-10-28T12:47:35.593 回答