1688

如何执行IF...THENinSQL SELECT语句?

例如:

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

31 回答 31

1941

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如果您希望结果为布尔值,则只需要使用运算符。如果您对 a 感到满意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
于 2008-09-15T14:38:24.473 回答
350

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

于 2008-09-15T15:10:49.870 回答
297

在 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

然而,有时必须小心避免这种方法的参数嗅探问题

于 2011-07-20T23:39:10.790 回答
102

你可以在The Power of SQL CASE Statements中找到一些很好的例子,我认为你可以使用的语句是这样的(来自4guysfromrolla):

SELECT
    FirstName, LastName,
    Salary, DOB,
    CASE Gender
        WHEN 'M' THEN 'Male'
        WHEN 'F' THEN 'Female'
    END
FROM Employees
于 2008-09-15T14:39:49.900 回答
79

使用案例。像这样的东西。

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END
于 2008-09-15T14:37:49.093 回答
51
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product
于 2008-09-15T14:37:44.523 回答
49

微软 SQL 服务器 (T-SQL)

在 aselect中,使用:

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
于 2008-09-15T14:40:04.580 回答
49

这个链接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 来说还不够好吗?

于 2010-01-06T01:02:08.577 回答
46
 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT
于 2008-09-15T14:37:56.673 回答
32

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
于 2015-12-17T17:24:10.927 回答
24

使用 CASE 语句:

SELECT CASE
       WHEN (Obsolete = 'N' OR InStock = 'Y')
       THEN 'Y'
       ELSE 'N'
END as Available

etc...
于 2008-09-15T14:40:26.823 回答
24

SQL Server 2012 中添加了一个新功能IIF(我们可以简单地使用):

SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
于 2016-04-26T15:10:54.010 回答
22

使用纯位逻辑:

DECLARE @Product TABLE (
    id INT PRIMARY KEY IDENTITY NOT NULL
   ,Obsolote CHAR(1)
   ,Instock CHAR(1)
)

INSERT INTO @Product ([Obsolote], [Instock])
    VALUES ('N', 'N'), ('N', 'Y'), ('Y', 'Y'), ('Y', 'N')

;
WITH cte
AS
(
    SELECT
        'CheckIfInstock' = CAST(ISNULL(NULLIF(ISNULL(NULLIF(p.[Instock], 'Y'), 1), 'N'), 0) AS BIT)
       ,'CheckIfObsolote' = CAST(ISNULL(NULLIF(ISNULL(NULLIF(p.[Obsolote], 'N'), 0), 'Y'), 1) AS BIT)
       ,*
    FROM
        @Product AS p
)
SELECT
    'Salable' = c.[CheckIfInstock] & ~c.[CheckIfObsolote]
   ,*
FROM
    [cte] c

请参阅工作演示:如果case在 SQL Server中没有。

首先,您需要计算选定条件的值true和值。false这里有两个NULLIF

for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)

结合在一起给出 1 或 0。接下来使用按位运算符

这是最所见即所得的方法。

于 2013-06-08T22:21:28.753 回答
18
SELECT 1 AS Saleable, *
  FROM @Product
 WHERE ( Obsolete = 'N' OR InStock = 'Y' )
UNION
SELECT 0 AS Saleable, *
  FROM @Product
 WHERE NOT ( Obsolete = 'N' OR InStock = 'Y' )
于 2016-05-11T15:56:30.827 回答
16
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
于 2015-08-25T09:44:46.240 回答
13
case statement some what similar to if in SQL server

SELECT CASE 
            WHEN Obsolete = 'N' or InStock = 'Y' 
               THEN 1 
               ELSE 0 
       END as Saleable, * 
FROM Product
于 2015-12-09T12:15:36.127 回答
12

这不是答案,只是我工作时使用的 CASE 语句的一个示例。它有一个嵌套的 CASE 语句。现在你知道为什么我的眼睛是交叉的。

 CASE orweb2.dbo.Inventory.RegulatingAgencyName
    WHEN 'Region 1'
        THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
    WHEN 'Region 2'
        THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
    WHEN 'Region 3'
        THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
    WHEN 'DEPT OF AGRICULTURE'
        THEN orweb2.dbo.CountyStateAgContactInfo.ContactAg
    ELSE (
            CASE orweb2.dbo.CountyStateAgContactInfo.IsContract
                WHEN 1
                    THEN orweb2.dbo.CountyStateAgContactInfo.ContactCounty
                ELSE orweb2.dbo.CountyStateAgContactInfo.ContactState
                END
            )
    END AS [County Contact Name]
于 2016-02-11T21:35:21.910 回答
11

如果您是第一次将结果插入表中,而不是将结果从一个表传输到另一个表,这在 Oracle 11.2g 中有效:

INSERT INTO customers (last_name, first_name, city)
    SELECT 'Doe', 'John', 'Chicago' FROM dual
    WHERE NOT EXISTS 
        (SELECT '1' from customers 
            where last_name = 'Doe' 
            and first_name = 'John'
            and city = 'Chicago');
于 2012-10-26T15:30:18.990 回答
9

作为该CASE语句的替代解决方案,可以使用表驱动方法:

DECLARE @Product TABLE (ID INT, Obsolete VARCHAR(10), InStock VARCHAR(10))
INSERT INTO @Product VALUES
(1,'N','Y'),
(2,'A','B'),
(3,'N','B'),
(4,'A','Y')

SELECT P.* , ISNULL(Stmt.Saleable,0) Saleable
FROM
    @Product P
    LEFT JOIN
        ( VALUES
            ( 'N', 'Y', 1 )
        ) Stmt (Obsolete, InStock, Saleable)
        ON  P.InStock = Stmt.InStock OR P.Obsolete = Stmt.Obsolete

结果:

ID          Obsolete   InStock    Saleable
----------- ---------- ---------- -----------
1           N          Y          1
2           A          B          0
3           N          B          1
4           A          Y          1
于 2018-01-31T11:31:07.450 回答
8
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
             END AS Saleable, * 
FROM Product
于 2017-08-08T21:33:52.243 回答
7

您可以有两种选择来实际实施:

  1. 使用从 SQL Server 2012 引入的 IIF:

    SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
    
  2. 使用Select Case

    SELECT CASE
        WHEN Obsolete = 'N' or InStock = 'Y'
            THEN 1
            ELSE 0
        END as Saleable, *
        FROM Product
    
于 2019-02-28T19:09:28.880 回答
5

对于使用 SQL Server 2012 的用户,IIF 是一项已添加的功能,可替代 Case 语句。

SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM   Product 
于 2014-01-08T10:18:59.093 回答
5
SELECT
if((obsolete = 'N' OR instock = 'Y'), 1, 0) AS saleable, *
FROM
product;
于 2020-11-25T14:04:50.093 回答
4
  SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
于 2016-11-30T11:05:06.307 回答
4

问题:

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

ANSI:

Select 
  case when p.Obsolete = 'N' 
  or p.InStock = 'Y' then 1 else 0 end as Saleable, 
  p.* 
FROM 
  Product p;

使用别名——p在这种情况下——将有助于防止出现问题。

于 2018-11-02T15:44:37.203 回答
4

使用 SQL CASE 就像普通的 If / Else 语句一样。在下面的查询中,如果过时值 = 'N' 或如果 InStock 值 = 'Y' 则输出将为 1。否则输出将为 0。然后我们将 0 或 1 值放在可销售列下。

SELECT
      CASE 
        WHEN obsolete = 'N' OR InStock = 'Y' 
        THEN 1 
        ELSE 0 
      END AS Salable
      , * 
FROM PRODUCT
于 2020-02-18T10:42:00.440 回答
3

它会是这样的:

SELECT OrderID, Quantity,
CASE
    WHEN Quantity > 30 THEN "The quantity is greater than 30"
    WHEN Quantity = 30 THEN "The quantity is 30"
    ELSE "The quantity is under 30"
END AS QuantityText
FROM OrderDetails;
于 2019-10-31T12:06:34.417 回答
2
SELECT 
  CAST(
    CASE WHEN Obsolete = 'N' 
    or InStock = 'Y' THEN ELSE 0 END AS bit
  ) as Saleable, * 
FROM 
  Product
于 2018-10-08T06:34:01.200 回答
2

为了完整起见,我要补充一点,SQL 使用三值逻辑。表达方式:

obsolete = 'N' OR instock = 'Y'

可以产生三个不同的结果:

| obsolete | instock | saleable |
|----------|---------|----------|
| Y        | Y       | true     |
| Y        | N       | false    |
| Y        | null    | null     |
| N        | Y       | true     |
| N        | N       | true     |
| N        | null    | true     |
| null     | Y       | true     |
| null     | N       | null     |
| null     | null    | null     |

因此,例如,如果产品已过时,但您不知道产品是否有库存,那么您不知道产品是否可销售。您可以将这个三值逻辑编写如下:

SELECT CASE
           WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
           WHEN NOT (obsolete = 'N' OR instock = 'Y') THEN 'false'
           ELSE NULL
       END AS saleable

一旦弄清楚它是如何工作的,就可以通过决定 null 的行为将三个结果转换为两个结果。例如,这会将 null 视为不可销售:

SELECT CASE
           WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
           ELSE 'false' -- either false or null
       END AS saleable
于 2019-11-28T10:17:11.160 回答
2

我喜欢使用 CASE 语句,但问题要求在 SQL Select 中使用 IF 语句。我过去使用的是:

SELECT

   if(GENDER = "M","Male","Female") as Gender

FROM ...

这就像 excel 或工作表 IF 语句,其中有一个条件,然后是真条件,然后是假条件:

if(condition, true, false)

此外,您可以嵌套 if 语句(但随后使用应该使用 CASE :-)

(注意:这适用于 MySQLWorkbench,但可能不适用于其他平台)

于 2020-04-09T01:31:38.797 回答
1

您可以使用案例陈述:

Select 
Case WHEN (Obsolete = 'N' or InStock = 'Y') THEN 1 ELSE 0 END Saleable,
Product.*
from Product
于 2020-05-21T18:44:59.193 回答