我有一个数据库表'Reports'。此表中的每列都是bit
类型。因此,如果值为1(即为真)则需要报告。
我有一个存储过程,用于填充临时表,所有报告都标记为true。
最好的方法是什么?我的CASE语句只返回第一个TRUE值,当我想要的是报告为TRUE的所有情况。
谢谢!
DECLARE @RequiredReports as table
(
Report nvarchar(150)
)
INSERT INTO @RequiredReports
(
Report
)
SELECT
CASE
WHEN r.ReportCountry = 1 THEN 'Country Report'
WHEN r.ReportPerson = 1 THEN 'Person Report'
WHEN r.ReportProfession = 1 THEN 'Profession Report'
WHEN r.ReportAge = 1 THEN 'Age Report'
END
FROM dbo.Reports r
答案 0 :(得分:5)
你可以像这样使用交叉申请:
select T.Name
from dbo.Reports as R
cross apply (select R.ReportCountry, 'Country Report' union all
select R.ReportPerson, 'Person Report' union all
select R.ReportProfession, 'Profession Report' union all
select R.ReportAge, 'Age Report') as T(Active, Name)
where T.Active = 1
http://data.stackexchange.com/stackoverflow/query/61227/unpivot-reports
在SQL Server 2008及更高版本中,您可以使用values
代替union all
。
select T.Name
from dbo.Reports as R
cross apply (values (R.ReportCountry, 'Country Report'),
(R.ReportPerson, 'Person Report'),
(R.ReportProfession, 'Profession Report'),
(R.ReportAge, 'Age Report')) as T(Active, Name)
where T.Active = 1
答案 1 :(得分:2)
您可以尝试使用UNPIVOT:
declare @Reports table (
[User] nvarchar(250) not null,
ReportCountry bit not null,
ReportPerson bit not null,
ReportProfession bit not null,
ReportAge bit not null
)
insert into @Reports ([User],ReportCountry,ReportPerson,ReportProfession,ReportAge)
select 'Damien',1,0,1,0
select
*
from
@Reports unpivot (RunReport for ReportName in (ReportCountry,ReportPerson,ReportProfession,ReportAge)) r
结果是:
User RunReport ReportName
Damien 1 ReportCountry
Damien 0 ReportPerson
Damien 1 ReportProfession
Damien 0 ReportAge
然后您可以将其视为正常的表源,以便进一步查询/过滤。