[英]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
。
变化:
JOIN
周围使用那些尴尬的括号。CASE
是条件表达式的 SQL 标准,尽管 SQL 服务器为 MS Access 兼容性做了“改造” IIF()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.