在sql 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 @

我正在寻找一种在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 @a
         WHEN < 3 THEN 0
         WHEN 3 THEN 1
         WHEN > 3 THEN 2
       END
…但是SQL不允许我以这种方式使用符号。有没有一种方法可以在SQL 2005中实现这一点,或者我需要像第一个那样使用代码

之所以只希望代码出现一次,是因为这将使代码更具可读性/可维护性,还因为我不确定SQL server是否必须为每个CASE语句运行计算

我正在寻找VB.NET case语句等效项:

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