在SQL中编写CASE语句

时间:2013-07-25 17:26:21

标签: sql sql-server tsql

我需要在报表中显示两列,其值将使用与以下相同的输入表达式确定:

SELECT     
CASE WHEN id>10

THEN 'AAAA'
 ELSE 
  'BBBB' 
 END as 'FirstColumn',  

CASE WHEN id>10

THEN 
  'BBBB' 
ELSE 
  'DDDD' END as 'SecondColumn'   

我可以构造这个表达式而不重复输入表达式两次,因为它们是相同的吗?

5 个答案:

答案 0 :(得分:1)

您需要为每个字段重复CASE语句,因为条件可能相同但结果不同。唯一的另一种选择是在第一个选择获取记录WHERE id< = 10而另一个执行WHERE ID> 10时使用UNion all语句。这可能是一个可行的替代方案,但它是一个维持小小的笨蛋,所以如果表现足够好,Iwoudl坚持重复CASE条件。

答案 1 :(得分:1)

如果假定某些复杂而不是id>10,那么为了使它更短一点,更具可读性:

select
  IIF(p.b=1, 'AAA', 'BBB') [Col1],
  IIF(p.b=1, 'BBB', 'DDD') [Col2]
from
  TableName t
  outer apply (select cast(case when t.id>10 then 1 else NULL end as bit) as b) p

但是,这仅适用于SqlServer 2012.在早期版本中,不幸的是,您必须编写自己的类似IIF的标量函数:

create function dbo.IIF (@b bit, @ifValue varchar(50), @elseValue varchar(50))
returns varchar(50)
as begin
  return (select case when @b = 1 then @ifValue else @elseValue end)
end
GO

select
  dbo.IIF(p.b, 'AAA', 'BBB') [Col1],
  dbo.IIF(p.b, 'BBB', 'DDD') [Col2]
from
  TableName t
  outer apply (select cast(case when t.id>10 then 1 else NULL end as bit) as b) p

答案 2 :(得分:0)

如果值得这么麻烦,你可以创建一个用户定义函数(UDF)来执行这个转换逻辑:

 CREATE FUNCTION dbo.fColTransform(@id Int)
     RETURNS Varchar(20)
 AS BEGIN
    DECLARE @ret Varchar(20)

    SET @ret = 
       CASE 
          WHEN @id IS NULL THEN 'Unknown'
          WHEN @id > 10 THEN 'BBB'
          ELSE 'DDD'
       END
    RETURN @ret
 END

然后,在SELECT中,你可以像这样构造它:

 SELECT dbo.fColTransform(id1) AS FirstColumn,
        dbo.fColTransform(id2) AS SecondColumn
  FROM MyTable

答案 3 :(得分:0)

您可以将其存储在变量中,然后使用Execute来调用它:

Declare @foo as nvarchar(max)
set @foo='MyTable'
execute ('Select * from ' + @foo)

缺点是你的整个查询都是红色的(因为它现在是一个字符串)。

答案 4 :(得分:0)

尝试使用此查询,可能会有用(如果您不使用函数,则可能):

WITH temp AS (
  SELECT     
    CASE WHEN x.ID > 10
      THEN 'AAAA'
      ELSE 'BBBB' 
    END as Col
  FROM (
        SELECT 1 AS ID
        UNION
        SELECT 11 AS ID
        UNION
        SELECT 13 AS ID
        UNION
        SELECT 9 AS ID
        UNION
        SELECT 7 AS ID  
  ) x
)
SELECT temp.Col AS  FirstColumn, temp.Col AS SecondColumn 
FROM temp 

基本上:

With name As (
     /*yourquery with one CASE-COLUMN*/
)
SELECT name.COL AS COLUMN1, name.COL AS COLUMN2 FROM name

您可以尝试此here