在SQL语句中将多个'AND x与y'分组

时间:2015-11-19 15:46:55

标签: sql sccm

我目前有一个SQL语句对我的程序来说太长了(我有一个可以使用的最大字符数。我正在使用sccm报告)。问题是我的SQL语句如下所示:

Select distinct v_GS_ADD_REMOVE_PROGRAMS_64.DisplayName0, v_GS_ADD_REMOVE_PROGRAMS_64.Publisher0, v_GS_ADD_REMOVE_PROGRAMS_64.Version0
FROM v_GS_ADD_REMOVE_PROGRAMS_64 
JOIN  v_R_System ON v_GS_ADD_REMOVE_PROGRAMS_64.ResourceID = v_R_System.ResourceID 
WHERE (v_R_System.Netbios_Name0 = @computername)

DisplayName0 NOT LIKE 'hpp%'
AND
DisplayName0 NOT LIKE 'Logitech SetPoint%'
AND
DisplayName0 NOT LIKE 'HP Document Manager%'
AND
DisplayName0 NOT LIKE 'HP Imaging Device Functions%'
AND
DisplayName0 NOT LIKE 'PyQt4 - PyQwt5%'

它持续20页。如何最小化此请求包含的代码量?有没有办法将所有displayName0 not like ??分组为NOT IN(value1, value2, ...)

2 个答案:

答案 0 :(得分:1)

如果你没有在你的模式中拖尾%,你可以用以下代码替换它:

SELECT ... WHERE DisplayName0 NOT IN ('hpp','Logitech SetPoint','HP Document Manager',...)

这会让它变得更短。

但在我看来,正确的解决方案是创建[temp]表,其中包含您需要过滤的所有名称,然后加入它。

答案 1 :(得分:1)

您可以将值存储在单独的表中,然后在查询中引用它吗?:

 SELECT DISTINCT v_GS_ADD_REMOVE_PROGRAMS_64.DisplayName0
    ,v_GS_ADD_REMOVE_PROGRAMS_64.Publisher0
    ,v_GS_ADD_REMOVE_PROGRAMS_64.Version0
FROM v_GS_ADD_REMOVE_PROGRAMS_64
JOIN v_R_System ON v_GS_ADD_REMOVE_PROGRAMS_64.ResourceID = v_R_System.ResourceID
WHERE (v_R_System.Netbios_Name0 = @computername) DisplayName0 NOT IN (
        SELECT DisplayName0
        FROM < NewTableName >
        )