Sql server 使用大小写SQL Server计算的字段上的WHERE子句

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

在我为SSRS rpt编写的这个查询中,我使用大小写将NULL更改为“Unclassified”,然后我希望通过包含“Unclassified”的multi-select参数(@Channel)进行过滤

我不能只使用子查询,因为用户定义了他们希望通过@Custnum参数查看的记录数


编辑:感谢所有伟大的答案,我学到了一些东西。

您可以使用
交叉应用
选择计算字段。然后使用其别名代替
频道

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)