协慌网

登录 贡献 社区

如何在 SQL SELECT 中执行 IF ... THEN?

如何在SQL SELECT语句中执行IF...THEN

例如:

SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product

答案

CASE语句最接近 SQL 中的 IF,并且在所有版本的 SQL Server 上都受支持

SELECT CAST(
             CASE 
                  WHEN Obsolete = 'N' or InStock = 'Y' 
                     THEN 1 
                  ELSE 0 
             END AS bit) as Saleable, * 
FROM Product

如果您希望将结果作为布尔值,则只需要执行CAST ,如果您对int感到满意,则可以:

SELECT CASE 
            WHEN Obsolete = 'N' or InStock = 'Y' 
               THEN 1 
               ELSE 0 
       END as Saleable, * 
FROM Product

CASE语句可以嵌入到其他CASE语句中,甚至包含在聚合中。

SQL Server Denali(SQL Server 2012)添加了IIF语句,该语句也可用于访问 :( Martin Smith指出)

SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product

在这种情况下,case 语句是你的朋友,并采用以下两种形式之一:

简单的案例:

SELECT CASE <variable> WHEN <value>      THEN <returnvalue>
                       WHEN <othervalue> THEN <returnthis>
                                         ELSE <returndefaultcase>
       END AS <newcolumnname>
FROM <table>

扩展案例:

SELECT CASE WHEN <test>      THEN <returnvalue>
            WHEN <othertest> THEN <returnthis>
                             ELSE <returndefaultcase>
       END AS <newcolumnname>
FROM <table>

您甚至可以将 case 语句放在 order by 子句中,以实现真正的花哨排序。

从 SQL Server 2012 开始,您可以使用IIF功能

SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM   Product

这实际上只是编写CASE的简写(尽管不是标准 SQL)。

与扩展的CASE版本相比,我更喜欢简洁。

IIF()CASE在 SQL 语句中解析为表达式,并且只能在定义良好的位置使用。

CASE 表达式不能用于控制 Transact-SQL 语句,语句块,用户定义函数和存储过程的执行流程。

如果这些限制无法满足您的需求(例如,需要根据某些条件返回不同形状的结果集),那么 SQL Server 也会有一个过程IF关键字。

IF @IncludeExtendedInformation = 1 
  BEGIN 
      SELECT A,B,C,X,Y,Z 
      FROM   T 
  END 
ELSE 
  BEGIN 
      SELECT A,B,C 
      FROM   T 
  END

但是,有时必须注意避免使用这种方法的参数嗅探问题。