Sql server 使用大小写SQL Server计算的字段上的WHERE子句
在我为SSRS rpt编写的这个查询中,我使用大小写将NULL更改为“Unclassified”,然后我希望通过包含“Unclassified”的multi-select参数(@Channel)进行过滤 我不能只使用子查询,因为用户定义了他们希望通过@Custnum参数查看的记录数Sql server 使用大小写SQL Server计算的字段上的WHERE子句,sql-server,reporting-services,Sql Server,Reporting Services,在我为SSRS rpt编写的这个查询中,我使用大小写将NULL更改为“Unclassified”,然后我希望通过包含“Unclassified”的multi-select参数(@Channel)进行过滤 我不能只使用子查询,因为用户定义了他们希望通过@Custnum参数查看的记录数 编辑:感谢所有伟大的答案,我学到了一些东西。您可以使用交叉应用选择计算字段。然后使用其别名代替频道: SELECT Top (Convert(int,@CustNum)) A ,B ,C
编辑:感谢所有伟大的答案,我学到了一些东西。您可以使用
交叉应用
选择计算字段。然后使用其别名代替频道
:
SELECT Top (Convert(int,@CustNum))
A
,B
,C
,x.Channel
FROM MYtable MT
LEFT JOIN ChannelTable CH ON MT.ChannelKey = CH.ChannelKey
CROSS APPLY (SELECT CASE
WHEN CH.Channel IS NULL THEN 'Unclassified'
ELSE CH.Channel
END) x(Channel)
WHERE x.Channel IN (@Channel)
在WHERE子句中重复相同的情况。您可以尝试以下方法:
SELECT Top (Convert(int,@CustNum)) A, B, C, Channel
FROM (SELECT A
,B
,C
,CASE WHEN CH.Channel IS NULL THEN 'Unclassified'
ELSE CH.Channel END AS Channel
FROM MYtable MT
LEFT JOIN ChannelTable CH
ON MT.ChannelKey = CH.ChannelKey
) AS T
WHERE Channel IN (@Channel);
或者这个:
SELECT Top (Convert(int,@CustNum))
A
,B
,C
,CASE WHEN CH.Channel IS NULL THEN 'Unclassified'
ELSE CH.Channel END AS Channel
FROM MYtable MT
LEFT JOIN ChannelTable CH
ON MT.ChannelKey = CH.ChannelKey
WHERE CASE WHEN CH.Channel IS NULL THEN 'Unclassified'
ELSE CH.Channel END IN (@Channel);
这可能就足够了:
SELECT Top (Convert(int,@CustNum))
A
,B
,C
,COALESCE(CH.Channel,'Unclassified') AS Channel
FROM MYtable MT
LEFT JOIN ChannelTable CH
ON MT.ChannelKey = CH.ChannelKey
WHERE COALESCE(Channel,'Unclassified') IN (@Channel)
只需执行子查询:
select Top (Convert(int,@CustNum)) * from(
SELECT
A
,B
,C
,CASE WHEN CH.Channel IS NULL THEN 'Unclassified'
ELSE CH.Channel END AS Channel
FROM MYtable MT
LEFT JOIN ChannelTable CH ON MT.ChannelKey = CH.ChannelKey)t
WHERE Channel IN (@Channel)
您还可以使用isnull(CH.Channel.‘Unclassified’)作为Channel,如果您希望在@Channel中有几个值,比如‘X’、‘Y’、‘Z’,那么除非您为isnull提示的in-clauseAnks构造动态SQL,否则这些值将无法工作。这是我首先做的。它不起作用,因为如果你想要前25条记录,那么你就过滤掉那些不在通道中的记录,你只有不到25条记录。我从中选择的表非常大,我可能在这里错了,但在我看来,选择所有的数据,然后从中选择前25位,这是非常低效的。这看起来很棒。我不熟悉交叉应用,将深入挖掘。
select Top (Convert(int,@CustNum)) * from(
SELECT
A
,B
,C
,CASE WHEN CH.Channel IS NULL THEN 'Unclassified'
ELSE CH.Channel END AS Channel
FROM MYtable MT
LEFT JOIN ChannelTable CH ON MT.ChannelKey = CH.ChannelKey)t
WHERE Channel IN (@Channel)