Sql 不使用'的If语句;案例';
假设我想使用SQL对某些内容进行简单检查,并将答案转换为一个位(布尔值)。例如,我想通过检查车轮的数量来检查某物是否是一辆汽车。我可以这样做:Sql 不使用'的If语句;案例';,sql,sql-server,tsql,Sql,Sql Server,Tsql,假设我想使用SQL对某些内容进行简单检查,并将答案转换为一个位(布尔值)。例如,我想通过检查车轮的数量来检查某物是否是一辆汽车。我可以这样做: CASE WHEN NumberOfWheels > 2 THEN 1 ELSE 0 END AS 'IsCar' 但这只给出了正确的值,而不是正确的数据类型。因此,我还需要添加一个转换为位 CAST( (CASE WHEN NumberOfWheels > 2 THEN 1 ELSE
CASE
WHEN NumberOfWheels > 2 THEN 1
ELSE 0
END AS 'IsCar'
但这只给出了正确的值,而不是正确的数据类型。因此,我还需要添加一个转换为位
CAST(
(CASE
WHEN NumberOfWheels > 2 THEN 1
ELSE 0
END)
AS BIT) 'IsCar'
现在这需要两个操作(CAST
和CASE
)而不是一个操作。而且它的可读性稍差。是否有可能以更简单的方式进行陈述,最好不使用CASE
。我想要这样的东西(不起作用):
这甚至有点可能吗?不,这是不可能的。T-SQL既没有布尔类型,也没有类型化的BIT
literals,因此无论您以何种方式对其进行切片,都将涉及转换。通过使用IIF
而不是CASE
,您仍然可以减少一些赘言,并且(在我看来)CONVERT
比CAST
稍微容易阅读,但这并不会改变基本原理:
SELECT IsCar = CONVERT(BIT, IIF(NumberOfWheels > 2, 1, 0))
不,这是不可能的。T-SQL既没有布尔类型,也没有类型化的BIT
literals,因此无论您以何种方式对其进行切片,都将涉及转换。通过使用IIF
而不是CASE
,您仍然可以减少一些赘言,并且(在我看来)CONVERT
比CAST
稍微容易阅读,但这并不会改变基本原理:
SELECT IsCar = CONVERT(BIT, IIF(NumberOfWheels > 2, 1, 0))
这是一个非常简单的查询,我看不出CAST
和CASE
有任何错误。我认为没有比这更简单的了。试着使用True和false顺便说一句,有些DBMS在选择列表中的NumberOfWheels>2
起作用,并返回True
或false
:-)虽然简单,但仍然是可能的两倍复杂(如果我能做我想做的事)。关于数据库提供程序的选择,我无法控制。如果CAST是个问题,则声明一个bit并返回bit变量,而不是1或0。这是一个非常简单的查询,我看不出CAST
和CASE
有任何错误。我认为没有比这更简单的了。试着使用True和false顺便说一句,有些DBMS在选择列表中的NumberOfWheels>2
起作用,并返回True
或false
:-)虽然简单,但仍然是可能的两倍复杂(如果我能做我想做的事)。关于数据库提供程序的选择,我无法控制。如果CAST是个问题,请声明一个bit并返回bit变量,而不是1或0谢谢。至少你让它看起来更漂亮了:-)。与我最初的建议相比,性能有什么不同吗?@Noceo:完全没有。内部IIF
被重写为案例
,因此两个表达式的执行计划完全相同。谢谢。至少你让它看起来更漂亮了:-)。与我最初的建议相比,性能有什么不同吗?@Noceo:完全没有。在内部,IIF
被重写为一个案例
,因此两个表达式的执行计划完全相同。