首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SQL SELECT中执行IF...THEN?

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

Stack Overflow用户
提问于 2008-09-15 14:34:09
回答 31查看 4.1M关注 0票数 1.7K

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

例如:

代码语言:javascript
复制
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
EN

回答 31

Stack Overflow用户

回答已采纳

发布于 2008-09-15 14:38:24

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

代码语言:javascript
复制
SELECT CAST(
             CASE
                  WHEN Obsolete = 'N' or InStock = 'Y'
                     THEN 1
                  ELSE 0
             END AS bit) as Saleable, *
FROM Product

如果希望结果为布尔值,则只需使用CAST运算符。如果你对int感到满意,这是可行的:

代码语言:javascript
复制
SELECT CASE
            WHEN Obsolete = 'N' or InStock = 'Y'
               THEN 1
               ELSE 0
       END as Saleable, *
FROM Product

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

SQL Server Denali (SQL Server2012)添加了access中也提供的IIF语句(由Martin Smith指出):

代码语言:javascript
复制
SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
票数 1.9K
EN

Stack Overflow用户

发布于 2008-09-15 15:10:50

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

简单的例子:

代码语言:javascript
复制
SELECT CASE <variable> WHEN <value>      THEN <returnvalue>
                       WHEN <othervalue> THEN <returnthis>
                                         ELSE <returndefaultcase>
       END AS <newcolumnname>
FROM <table>

扩展后的情况:

代码语言:javascript
复制
SELECT CASE WHEN <test>      THEN <returnvalue>
            WHEN <othertest> THEN <returnthis>
                             ELSE <returndefaultcase>
       END AS <newcolumnname>
FROM <table>

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

票数 350
EN

Stack Overflow用户

发布于 2011-07-21 07:39:11

在SQL Server2012中,您可以使用 function来实现这一点。

代码语言:javascript
复制
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM   Product

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

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

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

Transact-

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

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

代码语言:javascript
复制
IF @IncludeExtendedInformation = 1
  BEGIN
      SELECT A,B,C,X,Y,Z
      FROM   T
  END
ELSE
  BEGIN
      SELECT A,B,C
      FROM   T
  END

Care must sometimes be taken to avoid parameter sniffing issues with this approach however

票数 295
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档