如何在SQL SELECT中执行IF…THEN?
如何在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中没有 ,请参见。
首先,您需要计算选定条件下的true
和false
值。 这是两个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楼
您可以通过两种选择来实际实现:
使用从SQL Server 2012中引入的IIF:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
使用
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?相关推荐
- 如何在SQL Server中附加Pubs数据库
在本教程中,我将解释如何 在SQL Server中 附加Pubs数据库 . 每个其他数据库的过程都是相同的. 您需要将Pubs MDF和LDF文件附加到SQL Server. 请注意,Northwi ...
- 如何在SQL Server中实现错误处理
错误处理概述 (Error handling overview) Error handling in SQL Server gives us control over the Transact-SQL ...
- pl/sql 测试函数_如何在SQL单元测试中使用伪函数?
pl/sql 测试函数 In this article series, we are exploring SQL unit testing, in general, and also we are r ...
- sql server 数组_如何在SQL Server中实现类似数组的功能
sql server 数组 介绍 (Introduction) I was training some Oracle DBAs in T-SQL and they asked me how to cr ...
- 如何在SQL Server中比较表
介绍 (Introduction) If you've been developing in SQL Server for any length of time, you've no doubt hi ...
- 如何在SQL Server中使用级联删除?
本文翻译自:How do I use cascade delete with SQL Server? I have 2 tables: T1 and T2, they are existing tab ...
- @sql 单元测试_如何在SQL单元测试中使用假表?
@sql 单元测试 In this article on SQL unit testing, we will talk about how to isolate SQL unit tests from ...
- 如何在SQL Server中自动进行表分区
In this article, we will demonstrate specific ways to automate table partitioning in SQL Server. Thi ...
- 如果不使用 SQL Mail,如何在 SQL Server 中发送电子邮件
如果不使用 SQL Mail,如何在 SQL Server 中发送电子邮件 察看本文应用于的产品 文章编号 : 312839 最后修改 : 2006年12月21日 修订 : 10.1 本页 概要 SQ ...
最新文章
- 一体化设计让容灾变简单
- Springboot整合shiro基于url身份认证和授权认证
- POJ2528 线段树+离散化+hash(成段更新)
- 晒一下我的代码生成器
- 高斯投影坐标计算例题_利用MAPGIS软件进行投影变换
- 华为云服务器怎样让网站显示不出来,云服务器网页不显示图片
- ecshop添加商品选择品牌时如何按拼音排序
- Linux复习-C程序编译工具
- 一次生产内存溢出记录
- 中小学生计算机一等奖李广圆,喜报:昌乐一中学生在第二十届全国中小学电脑制作活动中获两项大奖...
- GML可视化学习(三)
- SICK CLV650-6000固定式扫码枪参数配置
- wingftpserver完整配置免费ftp站点(指南)
- 计算机丢失lame,libmp3lame64.dll
- 分段点处导数怎么求,导数和导函数的极限有关系吗?
- LowB三人组--插入排序原理和java实现
- 【系统篇 / 配置】❀ 06. 添加桌面图标 ❀ Windows Server 2016
- android百度地图定位文字表述,Android studio 百度地图开发(8)地图已标记POI点和搜索POI点的获取和利用...
- Android NFC开发概述
- muduo C++网络库的学习笔记
热门文章
- 算法--------数组--------容纳最多的水
- Installation error: INSTALL_FAILED_CANCELLED_BY_USER
- 【剑指offer-Java版】41和为s的两个数字VS和为s的连续正数序列
- INSTALL_FAILED_MISSING_SHARED_LIBRARY + Installation failed due to: ‘null‘
- Android的ImageView背后的绘制原理
- HTTP Content-Length与分块传输
- Java蓝桥杯——贪心算法
- 使用 Github Pages 发布你的项目文档
- Android APK反编译具体解释(附图)
- TestNG如何用命令行运行