访问查询 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 兼容性。
- 限定所有列引用!
问题: 我试图让下面的代码在 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 兼容性。- 限定所有列引用!