访问SQL Server查询的查询IIF语句
问题:我正在尝试让下面的代码在SQL Server中工作 我最初是在MS Access查询中编写代码的,但现在我需要在SQL Server中使用它。我遇到的问题是访问SQL Server查询的查询IIF语句,sql,sql-server,ms-access,iif,Sql,Sql Server,Ms Access,Iif,问题:我正在尝试让下面的代码在SQL Server中工作 我最初是在MS Access查询中编写代码的,但现在我需要在SQL Server中使用它。我遇到的问题是IIF语句在SQL Server中不起作用 我曾尝试使用Case语句,但它最终阻塞了我的SQL Server,并且从未加载任何数据。对于如何将IIF语句转换为SQL Server中使用的语句,是否有任何建议?如有任何反馈,将不胜感激。谢谢 MS Access查询中写入的代码: SELECT Customer.CustomerI
IIF
语句在SQL Server中不起作用
我曾尝试使用Case
语句,但它最终阻塞了我的SQL Server,并且从未加载任何数据。对于如何将IIF
语句转换为SQL Server中使用的语句,是否有任何建议?如有任何反馈,将不胜感激。谢谢
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 Server中尝试的解决方案:
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 Server支持IIF()
。在MS Access查询中需要更改的是联接的语法
尝试:
我还向查询中添加了表别名,因为它们使查询更具可读性(请将相关前缀添加到列Amount
)。最后,我认为SysCode
是一个数字,因此我删除了值周围的引号以进行比较(它确实是一个字符串,您可以将引号放回)
如果您运行的是SQL Server<2012,下面是案例
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;
自2012版以来,SQL Server支持IIF()
。在MS Access查询中需要更改的是联接的语法
尝试:
我还向查询中添加了表别名,因为它们使查询更具可读性(请将相关前缀添加到列Amount
)。最后,我认为SysCode
是一个数字,因此我删除了值周围的引号以进行比较(它确实是一个字符串,您可以将引号放回)
如果您运行的是SQL Server<2012,下面是案例
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 Server中工作。我更喜欢这样写:
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;
这猜测金额
来自费用
这些变化:
- SQL Server(没有其他数据库!)需要在多个
s之间加上那些笨拙的括号JOIN
- 表别名使查询更易于编写和读取
是条件表达式的SQL标准,尽管SQL Server为实现MS Access兼容性而“改装”CASE
IIF()
- 限定所有列引用李>
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;
这猜测金额
来自费用
这些变化:
- SQL Server(没有其他数据库!)需要在多个
s之间加上那些笨拙的括号JOIN
- 表别名使查询更易于编写和读取
是条件表达式的SQL标准,尽管SQL Server为实现MS Access兼容性而“改装”CASE
IIF()
- 限定所有列引用李>
SQL Server中支持
;它是在SQL Server 2012中引入的。如果您使用的版本比该版本旧,则当条件为truebranch或falsebranch END时,IIF()
等效为大小写
——您已将大小写
转换为=
并将=
转换为0
,这似乎是没有根据的。如果您使用的是2012年以前版本的SQL Server,然后,您可能应该查看升级路径。现在完全不支持2012年之前的任何版本。您实际收到了什么错误?您的案例实施看起来像是未来的建议。你所说的“陷入困境”是什么意思?它是否意味着查询永远无法完成?还是抛出错误?甚至是未知的问题。另一个问题是,您已将左联接转换为交叉联接,但联接中没有使用键-因此可能是性能错误在ANSI-92 SQL标准中(超过25年前),旧样式的逗号分隔表列表样式被正确的ANSINULL
语法所取代,不鼓励使用它。在MS Access中,您已经有了正确的JOIN
s-对于新的SQL Server代码,不要降级到JOIN
方法中的旧的蹩脚的“逗号分隔表”!FROM
在SQL Server中受支持。但是,它是在SQL Server 2012中引入的。如果您使用的版本比该版本旧,则当条件为truebranch ELSE falsebranch END时,IIF()
等效为大小写
——您已将大小写,然后truebranch ELSE falsebranch END
转换为=
=/code>并将
转换为0
,这似乎是不正确的d、 如果您使用的是比2012年更旧的SQL Server版本,那么您可能应该查看升级路径。2012年之前的任何版本现在都完全不受支持。您实际收到了什么错误?您的案例实施看起来已经像是未来的建议了。您所说的“停滞”是什么意思?它是否意味着查询永远不会完成ed?或抛出错误?甚至是未知问题。另一个问题是,您将左连接转换为交叉连接,而连接中没有使用键-因此可能是性能错误?-在ANSI-92 SQL标准中(超过25年前),旧样式的逗号分隔表列表样式被正确的ANSINULL
语法所取代不鼓励使用它。您在MS Access中已经有了适当的JOIN
s-不要降级到新SQL Server代码的JOIN
方法中旧的蹩脚的“逗号分隔表”!我不确定你是否提到这一点,但你似乎在修改它。他在SQL中的连接实际上是一个交叉连接,连接上没有逻辑,它在3中连接所有到所有tables@Cato:OP正在将其查询从MS Access迁移到SQL Server。显然,他们使用隐式交叉连接的尝试不是正确的方法……我认为这是真的,我只是向他指出了这一点,我认为这是他遇到的实际问题。嗨,GMB,我感谢你的反馈。我正在使用SQL Server 2017,但可能我研究错了。我不断地犯错误,我所发现的只是错误FROM