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

例如:

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

#1楼

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

INSERT INTO customers (last_name, first_name, city)SELECT 'Doe', 'John', 'Chicago' FROM dualWHERE NOT EXISTS (SELECT '1' from customers where last_name = 'Doe' and first_name = 'John'and city = 'Chicago');

#2楼

使用纯位逻辑:

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

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

首先,您需要计算选定条件下的truefalse值。 这是两个NULLIF :

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

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

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


#3楼

通过此链接 ,我们可以了解T-SQL中的IF THEN ELSE

IF EXISTS(SELECT *FROM   Northwind.dbo.CustomersWHERE  CustomerId = 'ALFKI')PRINT 'Need to update Customer Record ALFKI'
ELSEPRINT 'Need to add Customer Record ALFKI'IF EXISTS(SELECT *FROM   Northwind.dbo.CustomersWHERE  CustomerId = 'LARSE')PRINT 'Need to update Customer Record LARSE'
ELSEPRINT 'Need to add Customer Record LARSE'

对于T-SQL来说这还不够吗?


#4楼

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

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

#5楼

SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile

#6楼

case statement some what similar to if in SQL serverSELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 END as Saleable, *
FROM Product

#7楼

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 < 50PRINT 'what''s up?';
ELSEPRINT 'Bye Ravi Anand.';
END;GO

#8楼

这不是答案,只是我在工作中使用的CASE语句的示例。 它具有嵌套的CASE语句。 现在您知道为什么我的眼睛被交叉了。

 CASE orweb2.dbo.Inventory.RegulatingAgencyNameWHEN 'Region 1'THEN orweb2.dbo.CountyStateAgContactInfo.ContactStateWHEN 'Region 2'THEN orweb2.dbo.CountyStateAgContactInfo.ContactStateWHEN 'Region 3'THEN orweb2.dbo.CountyStateAgContactInfo.ContactStateWHEN 'DEPT OF AGRICULTURE'THEN orweb2.dbo.CountyStateAgContactInfo.ContactAgELSE (CASE orweb2.dbo.CountyStateAgContactInfo.IsContractWHEN 1THEN orweb2.dbo.CountyStateAgContactInfo.ContactCountyELSE orweb2.dbo.CountyStateAgContactInfo.ContactStateEND)END AS [County Contact Name]

#9楼

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

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

#10楼

SELECT 1 AS Saleable, *FROM @ProductWHERE ( Obsolete = 'N' OR InStock = 'Y' )
UNION
SELECT 0 AS Saleable, *FROM @ProductWHERE NOT ( Obsolete = 'N' OR InStock = 'Y' )

#11楼

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

#12楼

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

#13楼

作为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 PLEFT 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

#14楼

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

#15楼

题:

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将有助于防止出现问题。


#16楼

您可以通过两种选择来实际实现:

  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 

#17楼

将会是这样的:

SELECT OrderID, Quantity,
CASEWHEN 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;

#18楼

为了完整起见,我要补充一点,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 CASEWHEN obsolete = 'N' OR instock = 'Y' THEN 'true'WHEN NOT (obsolete = 'N' OR instock = 'Y') THEN 'false'ELSE NULLEND AS saleable

确定了它的工作原理后,可以通过确定null的行为将三个结果转换为两个结果。 例如,这会将null视为不可销售:

SELECT CASEWHEN obsolete = 'N' OR instock = 'Y' THEN 'true'ELSE 'false' -- either false or nullEND AS saleable

#19楼

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

#20楼

使用案例。 这样的事情。

SELECT Salable =CASE ObsoleteWHEN 'N' THEN 1ELSE 0END

#21楼

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

#22楼

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

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

如果要将结果作为布尔值,则仅需要执行CAST 。 如果您对int感到满意,则可以这样做:

SELECT CASEWHEN Obsolete = 'N' or InStock = 'Y'THEN 1ELSE 0END 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

#23楼

您可以在The Power of SQL CASE Statements中找到一些不错的示例,我认为您可以使用的语句将类似于以下内容(来自4guysfromrolla ):

SELECTFirstName, LastName,Salary, DOB,CASE GenderWHEN 'M' THEN 'Male'WHEN 'F' THEN 'Female'END
FROM Employees

#24楼

Microsoft 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

#25楼

使用CASE语句:

SELECT CASEWHEN (Obsolete = 'N' OR InStock = 'Y')THEN 'Y'ELSE 'N'
END as Availableetc...

#26楼

在这种情况下,案例陈述是您的朋友,采用两种形式之一:

简单的情况:

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子句中,以进行真正的排序。


#27楼

在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 = 1BEGINSELECT A,B,C,X,Y,ZFROM   TEND
ELSEBEGINSELECT A,B,CFROM   TEND

但是,有时必须小心避免这种方法引起的参数嗅探问题 。

如何在SQL SELECT中执行IF…THEN?相关推荐

  1. 如何在SQL Server中附加Pubs数据库

    在本教程中,我将解释如何 在SQL Server中 附加Pubs数据库  . 每个其他数据库的过程都是相同的. 您需要将Pubs MDF和LDF文件附加到SQL Server. 请注意,Northwi ...

  2. 如何在SQL Server中实现错误处理

    错误处理概述 (Error handling overview) Error handling in SQL Server gives us control over the Transact-SQL ...

  3. pl/sql 测试函数_如何在SQL单元测试中使用伪函数?

    pl/sql 测试函数 In this article series, we are exploring SQL unit testing, in general, and also we are r ...

  4. sql server 数组_如何在SQL Server中实现类似数组的功能

    sql server 数组 介绍 (Introduction) I was training some Oracle DBAs in T-SQL and they asked me how to cr ...

  5. 如何在SQL Server中比较表

    介绍 (Introduction) If you've been developing in SQL Server for any length of time, you've no doubt hi ...

  6. 如何在SQL Server中使用级联删除?

    本文翻译自:How do I use cascade delete with SQL Server? I have 2 tables: T1 and T2, they are existing tab ...

  7. @sql 单元测试_如何在SQL单元测试中使用假表?

    @sql 单元测试 In this article on SQL unit testing, we will talk about how to isolate SQL unit tests from ...

  8. 如何在SQL Server中自动进行表分区

    In this article, we will demonstrate specific ways to automate table partitioning in SQL Server. Thi ...

  9. 如果不使用 SQL Mail,如何在 SQL Server 中发送电子邮件

    如果不使用 SQL Mail,如何在 SQL Server 中发送电子邮件 察看本文应用于的产品 文章编号 : 312839 最后修改 : 2006年12月21日 修订 : 10.1 本页 概要 SQ ...

最新文章

  1. 一体化设计让容灾变简单
  2. Springboot整合shiro基于url身份认证和授权认证
  3. POJ2528 线段树+离散化+hash(成段更新)
  4. 晒一下我的代码生成器
  5. 高斯投影坐标计算例题_利用MAPGIS软件进行投影变换
  6. 华为云服务器怎样让网站显示不出来,云服务器网页不显示图片
  7. ecshop添加商品选择品牌时如何按拼音排序
  8. Linux复习-C程序编译工具
  9. 一次生产内存溢出记录
  10. 中小学生计算机一等奖李广圆,喜报:昌乐一中学生在第二十届全国中小学电脑制作活动中获两项大奖...
  11. GML可视化学习(三)
  12. SICK CLV650-6000固定式扫码枪参数配置
  13. wingftpserver完整配置免费ftp站点(指南)
  14. 计算机丢失lame,libmp3lame64.dll
  15. 分段点处导数怎么求,导数和导函数的极限有关系吗?
  16. LowB三人组--插入排序原理和java实现
  17. 【系统篇 / 配置】❀ 06. 添加桌面图标 ❀ Windows Server 2016
  18. android百度地图定位文字表述,Android studio 百度地图开发(8)地图已标记POI点和搜索POI点的获取和利用...
  19. Android NFC开发概述
  20. muduo C++网络库的学习笔记

热门文章

  1. 算法--------数组--------容纳最多的水
  2. Installation error: INSTALL_FAILED_CANCELLED_BY_USER
  3. 【剑指offer-Java版】41和为s的两个数字VS和为s的连续正数序列
  4. INSTALL_FAILED_MISSING_SHARED_LIBRARY + Installation failed due to: ‘null‘
  5. Android的ImageView背后的绘制原理
  6. HTTP Content-Length与分块传输
  7. Java蓝桥杯——贪心算法
  8. 使用 Github Pages 发布你的项目文档
  9. Android APK反编译具体解释(附图)
  10. TestNG如何用命令行运行