繁体   English   中英

访问查询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

自 2012 版起,SQL 服务器支持IIF() 。您需要在 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;

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

如果您正在运行 SQL 服务器 < 2012,这里是CASE sytanx:

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周围使用那些尴尬的括号。
  • 表别名使查询更易于编写和阅读。
  • CASE是条件表达式的 SQL 标准,尽管 SQL 服务器为 MS Access 兼容性做了“改造” IIF()
  • 限定所有列引用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM