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


我该如何表演 IF...THEN 在一个 SQL SELECT 声明?

例如:

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

1223
2017-09-15 14:34


起源


你可能想看看这个 链接。关于:SQL WHERE子句:避免使用CASE,使用布尔逻辑 - Somebody
@Somebody:不太相关,因为文章讨论了使用逻辑重写规则将隐含转换为析取。线索是“逻辑”这个词,即解析为真或假的东西,不适用于投影。 TL; DR文章适用于 WHERE 和 CHECK 但不是 SELECT。 - onedaywhen
@ MartinSmith的答案是最优雅的 - 在SQL 2012+中使用IIF。 - Murray Foxcroft


答案:


CASE statement最接近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 声明也可以在 访问:(指出 马丁史密斯

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

1459
2017-09-15 14:38



使用案例时,请注意不要在条件中包含您的条件。花了不少时间才意识到:) - Archan Mishra
并且不要忘记END - Simon_Weaver
和AS位! - Cas Bloem
Case,When,Else和End应该平行缩进(沿同一条线) - 然后才应该向内缩进 - 对我来说效果最好。 - Ujjwal Singh
@ReeveStrife只有iif SQL Server 2012+ - stuartdotnet


在这种情况下,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子句中,以实现真正的花哨排序。


283
2017-09-15 15:10



我知道这是旧的,但我认为应该注意你可以添加一个 AS Col_Name 之后 END 命名结果列 - Ben
我总觉得第二个更简单。 - Hogan
同意,我几乎总是使用扩展的case语句,因为我想要测试的条件总是比一个变量本身更复杂。这对我来说也更容易阅读。 - magnum_pi
两种情况的良好解释,有或没有变量。对于变量,条件需要满足case语句之后的变量与基于条件的变量之间的相等性,如果没有变量,则可以添加自足条件进行测试。 - Remus.A


从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 

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


213
2017-07-20 23:39



如果你想在SQL中使用IF .. then语句,这应该是答案。 - Mr.J


你可以找到一些很好的例子 SQL CASE语句的强大功能,我认为你可以使用的声明将是这样的(来自 4guysfromrolla):

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

74
2017-09-15 14:39



看到: meta.stackexchange.com/questions/103053/... 进行有趣的讨论。我提供的两个链接确实添加了额外的上下文,我支持。 - Sam Saffron
引用非常有用,强烈建议其他细节 - baymax


使用CASE。像这样的东西。

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

68
2017-09-15 14:37





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

42
2017-09-15 14:37





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

37
2017-09-15 14:37





Microsoft SQL Server(T-SQL)

在选择使用中:

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

35
2017-09-15 14:40





由此 链接,我们可以理解 IF THEN ELSE 在 T-SQL :

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来说不够好吗?


34
2018-01-06 01:02



这不是请求者想要的,但知道你可以使用if语句非常有用 外 选择陈述。 - Jonathan
EXISTS很好,因为如果找到项目,它会从搜索循环中踢出。 COUNT运行直到表行结束。与问题无关,但有些事要知道。 - JustJohn


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

25
2017-12-17 17:24