在sql case语句中使用比较符号
我正在寻找一种在sql select查询中使用小于号和大于号构建case语句的方法。例如,我想根据一个变量选择一个排名:在sql case语句中使用比较符号,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,我正在寻找一种在sql select查询中使用小于号和大于号构建case语句的方法。例如,我想根据一个变量选择一个排名: DECLARE @a INT SET @a = 0 SELECT CASE WHEN @a < 3 THEN 0 WHEN @a = 3 THEN 1 WHEN @a > 3 THEN 2 END 我想这样写: DECLARE @a INT SET @a = 0 SELECT CASE @
DECLARE @a INT
SET @a = 0
SELECT CASE
WHEN @a < 3 THEN 0
WHEN @a = 3 THEN 1
WHEN @a > 3 THEN 2
END
我想这样写:
DECLARE @a INT
SET @a = 0
SELECT CASE @a
WHEN < 3 THEN 0
WHEN 3 THEN 1
WHEN > 3 THEN 2
END
…但是SQL不允许我以这种方式使用Select Case i
Case Is < 100
p = 1
Case Is >= 100
p = 2
End Select
也许在SQL中是不可能的,没关系,我只是想确认一下。您可以将该函数用作
DECLARE @a INT
SET @a = 0
SELECT CASE SIGN(@a - 3)
WHEN -1 THEN 0
WHEN 0 THEN 1
WHEN 1 THEN 2
END
如果@a小于3,那么@a-3将产生一个负整数,其中符号返回-1
如果@a等于或大于3,则该符号分别返回0或1
如果所需的输出为0、1和2,则可以进一步简化:
DECLARE @a INT
SET @a = 0
SELECT SIGN(@a - 3) + 1
使用符号似乎是一个很好的解决方法。另一种方法是为表达式指定别名,使用子选择并在外部选择中使用其别名测试表达式:
SELECT
…,
CASE
WHEN expr < 3 THEN …
WHEN expr > 3 THEN …
END AS …
FROM (
SELECT
…,
a complex expression AS expr
FROM …
…
)
CASE与大多数其他编程语言中的CASE或SWITCH一样工作。我看不出你有什么需要。对不起,我问题的结尾被打断了。如果您仍然不理解我试图实现的目标,请告诉我案例表达式将短路并仅计算案例,直到且如果其中一个为真。我不认为另一种方法有任何优势。我知道它只会选择第一个计算结果为真的情况,我的问题是我希望它根据小于或大于号计算结果为真,而不是根据等于特定值进行计算。在这个例子中,当@a<3时写并不存在问题,但在我的实际代码中@a是一个长而复杂的等式。我不想维护它的3个副本,也不想让SQL为每个记录运行3次。如果可能的话,我更愿意像VB.Net所允许的那样去做。我已经提到过好几次了,我的代码没有@a那么简单,它实际上是一个复杂的方程:Col1*Col2+col3-Col2/col4。这需要为每一行计算。我同意第一条语句工作得很好,但是当您添加实际列名的长度时,就很难阅读了。我看不出这是如何更易于维护的。任何了解SQl的人都会发现OP不喜欢的原始语句,但它更清晰。@HLGEM如果@a只是一个简单的表达式,我也会同意你的看法,但根据OP的说法,@a是一个很长很复杂的表达式,他不希望在case语句中看到重复三次。所以,我想我或安德烈·M的解决方案适合解决他的问题。好吧,对我来说,这非常有效。我必须确定最近在荷兰发生变化的增值税百分比。我只是使用datediff函数将产品的交付日期与应使用新增值税百分比的日期进行比较,然后使用符号构造来确定正确的增值税百分比。对我来说,这似乎是一个足够优雅的解决方案。最初的问题是如何使条件不出现在每一行上。这实际上并没有回答这个问题,因为我仍然需要在其中两行重复等式,并假设elseI无法对此进行修正,因为它不一定解决了原始问题,但它解决了我的问题。谢谢只需要将ColumnName从CASE行移到WHEN行。
SELECT
CASE
WHEN ColumnName >=1 and ColumnName <=1 THEN 'Fail'
WHEN ColumnName >=6 THEN 'Pass'
ELSE 'Test'
END
FROM TableName