Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问SQL Server查询的查询IIF语句_Sql_Sql Server_Ms Access_Iif - Fatal编程技术网

访问SQL Server查询的查询IIF语句

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

问题:我正在尝试让下面的代码在SQL Server中工作

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