我需要在报表中显示两列,其值将使用与以下相同的输入表达式确定:
SELECT
CASE WHEN id>10
THEN 'AAAA'
ELSE
'BBBB'
END as 'FirstColumn',
CASE WHEN id>10
THEN
'BBBB'
ELSE
'DDDD' END as 'SecondColumn'
我可以构造这个表达式而不重复输入表达式两次,因为它们是相同的吗?
答案 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