Sql 带有like和not like运算符的Where子句不起作用

Sql 带有like和not like运算符的Where子句不起作用,sql,sql-server-2012,Sql,Sql Server 2012,我有一个疑问: SELECT DISTINCT REPLACE(REPLACE(A.[NOME COMERCIAL],'.',''),'&','') AS [NOME COMERCIAL] , ISNULL(A.[PLANO], '') AS PLANO , A.[Plano Foco] , CONVERT(DECIMAL(18,2),A.[PRECO]) AS PRECO , B.[FEAT_CAMERA] , B

我有一个疑问:

SELECT 
DISTINCT 
REPLACE(REPLACE(A.[NOME COMERCIAL],'.',''),'&','') AS [NOME COMERCIAL]        ,
ISNULL(A.[PLANO], '') AS PLANO       ,
A.[Plano Foco]        ,
CONVERT(DECIMAL(18,2),A.[PRECO]) AS PRECO        ,
B.[FEAT_CAMERA]        ,
B.[FEAT_TELA]        ,
B.[FEAT_CAP_ARMAZENAMENTO]        ,
B.[FEAT_PROCESSADOR]        ,
B.[FEAT_MEMORIA_RAM]        ,
B.[FEAT_BATERIA]        ,
B.[EXTRA_INFO_1]        ,
B.[EXTRA_INFO_2]        ,
B.[EXTRA_INFO_3]  
FROM [TABELA DE PRECOS] AS A
LEFT JOIN DE_PARA_SAP_APARELHOS AS B
  ON (A.[NOME DPGC] = B.APARELHODPAV)
WHERE PLANO LIKE '%CONTROLE%'
  AND PLANO NOT LIKE '%Renova%'
  AND A.[PRODUTO] IN ('Smartphone', 'Blackbox 3G', 'Blackbox 4G', 'Fixo', 'Modem 3G', 'Modem 4G', 'Tablet')
  AND REPLACE(REPLACE(REPLACE(A.[NOME DPGC],'&',''),'''',''),'.','') = 'Iphone XR 64GB' 
   OR REPLACE(REPLACE(REPLACE(B.[APARELHODPAV],'&',''),'''',''),'.','') = 'Iphone XR 64GB'
  AND A.[REGIAO] = '7x'
ORDER BY PRECO,[PLANO]  
我搜索了一下,发现如果有空值,LIKE和notlike不能正常工作,所以我使用ISNULL。但我仍然得到包含“Renova”的值:

Novo Vivo V (Renova)
Novo Vivo V
Vivo Família 70GB (Renova)
Vivo Família 50GB (Renova)
Vivo Família 70GB
Vivo Controle....

我没有收到任何错误消息。查询运行得很好,但就像我的like和notlike运算符被忽略或类似的情况。我在这里遗漏了什么?

或子句中缺少括号:

SELECT DISTINCT REPLACE(REPLACE(A.[NOME COMERCIAL],'.',''),'&','') AS [NOME COMERCIAL]        ,
                ISNULL(A.[PLANO], '') AS PLANO       ,
                A.[Plano Foco]        ,
                CONVERT(DECIMAL(18,2),A.[PRECO]) AS PRECO        ,
                B.[FEAT_CAMERA]        ,
                B.[FEAT_TELA]        ,
                B.[FEAT_CAP_ARMAZENAMENTO]        ,
                B.[FEAT_PROCESSADOR]        ,
                B.[FEAT_MEMORIA_RAM]        ,
                B.[FEAT_BATERIA]        ,
                B.[EXTRA_INFO_1]        ,
                B.[EXTRA_INFO_2]        ,
                B.[EXTRA_INFO_3]  
FROM @A AS A 
    LEFT JOIN @B AS B  ON 
    A.[NOME DPGC] = B.APARELHODPAV
WHERE   PLANO LIKE '%CONTROLE%'  AND 
        PLANO NOT LIKE '%Renova%'  AND 
        A.[PRODUTO] IN ('Smartphone', 'Blackbox 3G', 'Blackbox 4G', 'Fixo', 'Modem 3G', 'Modem 4G', 'Tablet')  AND 
        (REPLACE(REPLACE(REPLACE(A.[NOME DPGC],'&',''),'''',''),'.','') = 'Iphone XR 64GB' OR REPLACE(REPLACE(REPLACE(B.[APARELHODPAV],'&',''),'''',''),'.','') = 'Iphone XR 64GB') AND 
        A.[REGIAO] = '7x' 
ORDER BY PRECO,[PLANO]  

如果您不想将Renova包括在内,请不要将其包括在where子句中,它将免于选择。这会解决你的问题。

这不是像那样的
(不是)。当你格式化你的查询(我为你做的)时,更容易发现有一个
ed条件
的优先级高于
,您可能不希望-->在
条件周围添加参数<代码>和(替换(替换(替换(A.[NOME DPGC]、'&'、''、''、''、''、'')='Iphone XR 64GB'或替换(替换(替换(B.[APARELHODPAV]、'&'、''、''、''、''、'')='Iphone XR 64GB')和A.[REGIAO]='7x'
。顺便说一句,当你混合使用
@dnoth时,你应该始终使用parens。我不知道为什么你没有给出答案
喜欢和不喜欢不能正常工作,所以我使用的是ISNULL
。。。。。我在任何地方都看不到ISNULL