从表中返回所有“真实”案例

时间:2012-02-09 10:13:40

标签: sql sql-server

我有一个数据库表'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

2 个答案:

答案 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

然后您可以将其视为正常的表源,以便进一步查询/过滤。