访问查询 IIF 语句到 SQL 服务器查询

Access query IIF statement to SQL Server query

问题: 我试图让下面的代码在 SQL 服务器中工作。

我最初在 MS Access 查询中编写代码,但现在我需要在 SQL 服务器中使用它。我遇到的问题是 IIF 语句在 SQL 服务器中不起作用。

我曾尝试使用 Case 语句,但它最终使我的 SQL 服务器陷入困境并且从未加载任何数据。关于如何转换要在 SQL 服务器中使用的 IIF 语句有什么建议吗?对于任何反馈,我们都表示感谢。谢谢!

用 MS Access 查询编写的代码:

SELECT 
    Customer.CustomerID, 
    IIf([ExpenseCode].[SysCode] >= '1747', [Amount], 0) AS Trains
FROM   
    Customer 
LEFT JOIN 
    (Expense 
LEFT JOIN 
    ExpenseCode ON Expense.SysCode = ExpenseCode.SysCode) ON Customer.CustomerID = Expense.EntityID;

在 SQL 服务器中尝试的解决方案:

SELECT DISTINCT
    r.CustomerID,
    CASE
        WHEN t.SysCode = '1747'
           THEN e.Amount
        ELSE NULL
    END AS Trains
FROM
    ExpenseCode AS t, Expense AS e, Customer AS r

IIF() 自 2012 版起在 SQL 服务器中受支持。您需要在 MS Access 查询中更改的是连接的语法。

尝试:

SELECT 
    c.CustomerID, 
    IIf(ec.SysCode >= 1747, Amount, 0) AS Trains
FROM   
    Customer c
    LEFT JOIN Expense e ON c.CustomerID = e.EntityID
    LEFT JOIN ExpenseCode ec ON e.SysCode = ec.SysCode;

我还为您的查询添加了 table 别名,因为它们使它更具可读性(请将相关前缀添加到列 Amount)。最后,我认为SysCode是一个数字,所以我去掉了这个值周围的引号进行比较(它确实是一个字符串,你可以把引号放回去)。

如果您是 运行 SQL 服务器 < 2012,这里是 CASE 语法:

SELECT 
    c.CustomerID, 
    CASE WHEN ec.SysCode >= 1747 THEN Amount ELSE 0 END AS Trains
FROM   
    Customer c
    LEFT JOIN Expense e ON c.CustomerID = e.EntityID
    LEFT JOIN ExpenseCode ec ON e.SysCode = ec.SysCode;

您的代码应该可以在 SQL 服务器上运行。我宁愿把它写成:

SELECT c.CustomerID, 
       (CASE WHEN ec.SysCode >= '1747' THEN e.Amount ELSE 0 END) AS Trains
FROM Customer c LEFT JOIN 
     Expense e
     ON c.CustomerID = e.EntityID LEFT JOIN 
     ExpenseCode ec
     ON e.SysCode = ec.SysCode;

这猜测 Amount 来自 Expense

变化:

  • SQL 服务器(而不是其他数据库!)需要在多个 JOIN 周围使用那些笨拙的括号。
  • Table 别名使查询更易于编写和阅读。
  • CASE 是条件表达式的 SQL 标准,尽管 SQL 服务器确实 "retrofit" IIF() 用于 MS Access 兼容性。
  • 限定所有列引用!