我需要在报告中显示两列,其值将使用相同的输入表达式确定,如下所示:
SELECT
CASE WHEN id>10
THEN 'AAAA'
ELSE
'BBBB'
END as 'FirstColumn',
CASE WHEN id>10
THEN
'BBBB'
ELSE
'DDDD' END as 'SecondColumn'
我可以构造这个表达式而不重复输入表达式两次,因为它们是相同的吗?
我需要在报告中显示两列,其值将使用相同的输入表达式确定,如下所示:
SELECT
CASE WHEN id>10
THEN 'AAAA'
ELSE
'BBBB'
END as 'FirstColumn',
CASE WHEN id>10
THEN
'BBBB'
ELSE
'DDDD' END as 'SecondColumn'
我可以构造这个表达式而不重复输入表达式两次,因为它们是相同的吗?
您需要为每个字段重复 CASE 语句,因为条件可能相同但结果不同。唯一的另一种选择是在第一个选择获取记录 WHERE id<=10 而另一个选择 WHERE ID>10 时使用 UNion all 语句。这可能是一个可行的替代方案,但维护起来有点麻烦,所以如果性能足够好,Iwoudl 会坚持重复 CASE 条件。
如果应该使用一些复杂的东西而不是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
如果值得麻烦,您可以创建一个用户定义函数 (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
您可以将其存储在变量中并用于Execute
调用它:
Declare @foo as nvarchar(max)
set @foo='MyTable'
execute ('Select * from ' + @foo)
缺点是你的整个查询都是红色的(因为它现在是一个字符串)。
试试这个查询,也许会有用(如果你不使用函数):
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
你可以在这里试试