IF...THEN
语句中执行SQL SELECT
?例如:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
#1 楼
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
布尔值。如果您对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
评论
请注意,在使用手提箱时,请不要将您的情况限制在刹车片中。花了很多时间来意识到:)
–Archan Mishra
2011-09-13 15:41
别忘了结束
–Simon_Weaver
2014年1月28日上午10:52
和AS位!
–Cas Bloem
2014年4月22日在12:49
@ReeveStrife仅iif SQL Server 2012+
–stuartdotnet
16年5月30日在3:26
当心CASE / IIF的肮脏机密:sqlperformance.com/2014/06/t-sql-queries/…
–user170442
17年1月27日,12:21
#2 楼
在这种情况下,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子句中,以进行真正的排序。
评论
我知道这很旧,但是我认为应该注意,您可以在END之后添加一个AS Col_Name来命名结果列
–本
2012年6月18日上午10:22
我总是觉得第二个比较简单。
– Hogan
16年4月15日在20:32
同意,我几乎总是使用扩展的case语句,因为我要测试的条件总是比一个变量本身更复杂。对我来说,阅读起来也更容易。
– Magnum_pi
16年5月18日在16:34
很好地解释了两种情况,有无变量都没有。使用变量,条件需要满足case语句后的变量与条件所基于的条件之间的相等性,没有变量,则可以添加自足条件进行测试。
– Remus.A
18年2月23日在11:24
第二种选择让我更加方便。两者同样好。
–斯坦利·奥克帕拉·努萨(Stanley Okpala Nwosa)
18-10-20在9:30
#3 楼
在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 = 1
BEGIN
SELECT A,B,C,X,Y,Z
FROM T
END
ELSE
BEGIN
SELECT A,B,C
FROM T
END
有时必须小心避免这种方法引起的参数嗅探问题。
评论
如果要使用SQL中的IF..then语句,这应该是答案。
– J先生
17年3月16日在3:27
#4 楼
您可以在“ SQL CASE语句的强大功能”中找到一些不错的示例,我认为您可以使用的语句将类似于以下内容(来自4guysfromrolla):SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
评论
请参阅:meta.stackexchange.com/questions/103053/…进行有趣的讨论。如果您提供的两个链接确实添加了我支持的额外上下文。
– Sam Saffron
2011年8月19日在2:47
引用真的很有用,如果有其他详细信息,强烈建议
– baymax
16 Dec 7'在14:56
#5 楼
使用案例。这样的事情。SELECT Salable =
CASE Obsolete
WHEN 'N' THEN 1
ELSE 0
END
#6 楼
SELECT
(CASE
WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
ELSE 'NO'
END) as Salable
, *
FROM Product
#7 楼
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
评论
您为什么不只在过时='N'或InStock ='Y'处做,然后将其中的位置切成两半
– maksymiuk
19年6月7日在22:04
#8 楼
通过此链接,我们可以了解T-SQL中的IF THEN ELSE
: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不够好吗?
评论
这不是请求者想要的,但是对于知道可以在select语句之外使用if语句非常有用。
–乔纳森
13年4月10日在8:06
EXISTS很好,因为如果找到了项目,它将退出搜索循环。 COUNT一直运行到表行末尾。与问题无关,但要知道一些事情。
–约翰
16年2月11日在21:12
#9 楼
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
#10 楼
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
评论
较晚,但是可以按OP要求在SELECT内使用吗?
– Abdul qayyum
19年2月17日在10:23
#11 楼
SQL Server 2012中添加了一项新功能IIF(我们可以简单使用):SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
评论
该答案重复了(细节较少),几年前马丁·史密斯已经在答案中提供了。
– jk7
18-10-31在19:47
@ jk7这是该问题的第一个答案。
–山地生肉
18年11月1日在2:46
不是从我所看到的。它说您的答案发布于16年4月26日,马丁的发布于11年7月20日。
– jk7
18年2月2日在14:40
#12 楼
使用CASE语句:SELECT CASE
WHEN (Obsolete = 'N' OR InStock = 'Y')
THEN 'Y'
ELSE 'N'
END as Available
etc...
#13 楼
使用纯位逻辑: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中没有
case
,请开始工作。所选条件下的true
和false
的值。这是两个NULLIF:for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
加起来得到1或0。接下来使用按位运算符。 />
评论
-1用于代码混淆。严重的是,这与所见即所得的距离差不多!一片红润的无法理解的烂摊子,如果我必须处理您的代码,我将整天咒骂...对不起:-/
–里加德·斯汀
13年6月22日在8:47
@Heliac将cte放在View中,您将永远看不到混乱。对于漫长而复杂的AND,OR,它比CASE(当然是cte之外的部分)更具可读性。
– Tomasito
13年6月23日在9:52
我将它的整洁度设为+1,但请注意,该问题的答案目前是错误的。您需要一个“ |”不是“&”。
–马克·赫德
16年11月16日在0:19
完全同意@Heliac。虽然它在语法上是正确的并且可以正常工作,但它并不容易得到支持。将其放在CTE中只会将这段不可读的代码移到其他地方。
–objectNotFound
17年11月24日在17:04
表格检查组合可能有其优点。使用表变量并将其连接到现有查询可以提供基于案例的解决方案。这个答案是一个不好的例子,但是餐桌创意本身是有好处的。
– Suncat2000
18年11月30日在13:19
#14 楼
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' )
#15 楼
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
评论
你能详细说明吗?
– Peter Mortensen
19年3月3日在15:57
#16 楼
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月9日下午13:32
@Guanxi:尽管不是我的回答,但“案例”概括了“ if-then-else”(从2个案例到很多案例)
–JosephDoggie
18-10-2的16:39
你能详细说明吗?
– Peter Mortensen
19年3月3日在15:57
#17 楼
这不是答案,只是我在工作中使用的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]
评论
重新格式化Case语句的编辑既好又花哨,使它更易于理解,但是SQL仍会在使用它的视图中将其汇总。
–约翰
16-10-12在16:30
我只是在徘徊为什么CASE被投票并标记为答案,而不是应该是答案的IF,就像这个,这仍然是CASE语句,而不是IF。
– J先生
17年3月22日在7:16
@ Jr.J:虽然不是我的回答,但“案例”概括了“ if-then-else”(从2个案例到很多案例)
–JosephDoggie
18-10-2在16:40
#18 楼
如果您是第一次将结果插入表中,而不是将结果从一个表转移到另一个表,则此方法在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');
评论
标签说SQL Server,TSQL
–玛拉基
2012年12月27日15:46
#19 楼
作为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
评论
可售用于查询中的条件?
– Bhavin Thummar
19年11月8日在12:14
可以在有条件的地方使用。
– Serkan Arslan
19年11月8日在12:36
#20 楼
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0
END AS Saleable, *
FROM Product
#21 楼
对于使用SQL Server 2012的用户,IIF是一项已添加的功能,可作为Case语句的替代方法。SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
评论
该答案重复了(细节较少),几年前马丁·史密斯已经在答案中提供了。
– jk7
18-10-31在19:44
#22 楼
SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
评论
嗨Surjeet Singh Bisht;您的代码可能是正确的,但在某些情况下,它将提供更好的答案;例如,您可以解释此提议的更改如何以及为什么能够解决发问者的问题,也许还包括相关文档的链接。这将使其对他们更有用,对正在寻找类似问题的解决方案的其他站点读者也将更有用。
–文斯·鲍德伦(Vince Bowdren)
16年11月30日在16:27
此答案不会添加任何新内容。实际上,在过去的5年中,这条相同的路线一直是公认答案的一部分。
– S.L.巴特-恢复莫妮卡
16年11月30日在19:20
此外,重要的是要提到IIF仅适用于从2012开始的SQL Server
–伊凡·拉斯孔(Ivan Rascon)
17年1月26日在16:24
#23 楼
您可以通过两种选择来实现此目标:使用从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
#24 楼
问题: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
-将有所帮助防止问题。#25 楼
使用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
评论
就像普通的If / Else语句一样。如果过时的值='N'或如果库存值='Y',则输出为1。否则,输出为0。
–塔鲁卡
2月18日,11:22
谢谢。请编辑您的帖子以添加此说明。像:If..Then ... Else ..语句在SQL中的用法如下。
–user10216583
2月18日上午11:39
#26 楼
就像这样: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;
评论
我们可以在查询的where条件中使用QuantityText值吗?例如,当数量> 30则“数量大于30”时选择SELECT ID,数量,当数量= 30则“数量为30”否则,“数量小于30”时结束ASE AS FROM OrderDetails中的QuantityText WHERE QuantityText ='The数量为30';
– Bhavin Thummar
19年11月8日在12:14
#27 楼
SELECT
CAST(
CASE WHEN Obsolete = 'N'
or InStock = 'Y' THEN ELSE 0 END AS bit
) as Saleable, *
FROM
Product
评论
点评来源:欢迎来到Stack Overflow!请不要只回答源代码。尝试提供有关您的解决方案如何工作的很好的描述。请参阅:我如何写一个好的答案?谢谢
–sɐunıɔןɐqɐp
18-10-8在6:52
我想您会发现它没有执行,因为它缺少'THEN'关键字之后的任何输出。
–十二音电话
19年4月5日在14:00
你能详细说明吗?
– Peter Mortensen
19年6月3日在16:01
#28 楼
为了完整性,我要补充一点,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
#29 楼
我喜欢使用CASE语句,但是这个问题要求在SQL Select中使用IF语句。我过去使用的是:SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
就像excel或sheet IF语句一样,其中先有条件又有条件,然后是条件条件:
if(condition, true, false)
此外,您可以嵌套if语句(但是使用时应使用CASE :-)
(注意:此可在MySQLWorkbench中使用,但可能无法在其他平台上使用)
评论
IF函数在MySQL中似乎存在,但在MSSQL中不存在。自2012年以来,在MSSQL中可以使用IIF。
–卢克
8月1日9:15
#30 楼
您可以使用Case语句:Select
Case WHEN (Obsolete = 'N' or InStock = 'Y') THEN 1 ELSE 0 END Saleable,
Product.*
from Product
评论
您可能需要查看此链接。关于:SQL WHERE子句:避免使用CASE,请使用布尔逻辑@Somebody:不太相关,因为本文讨论了使用逻辑重写规则将蕴涵转换为析取关系。线索是``逻辑''一词,即可以解析为真或假的东西,不适用于投影。 TL; DR文章适用于WHERE和CHECK,但不适用于SELECT。
@MartinSmith的答案是最优雅的-在SQL 2012+中使用IIF。