2

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

SELECT     
CASE WHEN id>10

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

CASE WHEN id>10

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

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

4

5 回答 5

1

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

于 2013-07-25T17:34:13.403 回答
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
于 2013-07-25T17:46:48.967 回答
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
于 2013-07-25T17:44:58.460 回答
0

您可以将其存储在变量中并用于Execute调用它:

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

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

于 2013-07-25T17:47:20.937 回答
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

你可以在这里试试

于 2013-07-25T17:48:25.747 回答