如何在SQL SELECT语句中执行IF...THEN条件判断?

1784

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

例如:

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

2029

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语句,它也可以在Access中使用(由Martin Smith指出)。

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

5
小心CASE/IIF表达式的不良问题:https://sqlperformance.com/2014/06/t-sql-queries/dirty-secrets-of-the-case-expression - user170442
我在SQLite3数据库上实现了这个,遵循了这个教程:https://www.sqlitetutorial.net/sqlite-functions/sqlite-iif/ - ftani

365

在这种情况下,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>

你甚至可以在order by子句中放置case语句以实现非常炫酷的排序。


318

从SQL Server 2012开始,您可以使用IIF函数来实现此功能。

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

这实际上只是一种简写方式(虽然不是标准SQL)来编写CASE语句。

与展开的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

但是,有时候需要注意避免使用此方法引起参数嗅探问题。


113

你可以在SQL CASE语句的威力中找到一些不错的例子,我认为你可以使用以下语句(来自4guysfromrolla):

SELECT
    FirstName, LastName,
    Salary, DOB,
    CASE Gender
        WHEN 'M' THEN 'Male'
        WHEN 'F' THEN 'Female'
    END
FROM Employees

87

使用案例。类似这样。

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END

62
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product

52

这个链接我们可以了解在T-SQL中的IF THEN ELSE

IF EXISTS(SELECT *
          FROM   Northwind.dbo.Customers
          WHERE  CustomerId = 'ALFKI')
  PRINT 'Need to update Customer Record ALFKI'
ELSE
  PRINT 'Need to add Customer Record ALFKI'

IF EXISTS(SELECT *
          FROM   Northwind.dbo.Customers
          WHERE  CustomerId = 'LARSE')
  PRINT 'Need to update Customer Record LARSE'
ELSE
  PRINT 'Need to add Customer Record LARSE' 

这难道不足以用于T-SQL吗?


3
这不是请求者想要的,但知道你可以在选择语句之外使用if语句非常有用。 - Jonathan
2
EXISTS很好,因为如果找到项目,它会退出搜索循环。COUNT会一直运行到表行的末尾。虽然与问题无关,但这是需要知道的事情。 - JustJohn

51

微软SQL Server(T-SQL)

select语句中使用:

select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end

where 子句中使用:

where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end

1
为什么你不只是做 where Obsolete = 'N' or InStock = 'Y' 并且实际上将 where 减半呢? - maraaaaaaaa

50
 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT

34

SQL Server中的简单if-else语句:

DECLARE @val INT;
SET @val = 15;

IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';

GO

SQL Server 中的嵌套 If...else 语句 -

DECLARE @val INT;
SET @val = 15;

IF @val < 25
PRINT 'Hi Ravi Anand.';
ELSE
BEGIN
IF @val < 50
  PRINT 'what''s up?';
ELSE
  PRINT 'Bye Ravi Anand.';
END;

GO

3
迟了一些,但是像 OP 问的那样,它可以在 SELECT 中使用吗? - abdul qayyum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接