it-swarm-pt.tech

NÃO GOSTA e COMO NÃO retornar resultado oposto

Eu tenho uma tabela com 200 registros dos quais 10 registros tem texto contendo o Word 'TAX'.

Quando estou executando

Select * from tbl1 WHERE [TextCol] LIKE '%TAX%'

então eu recebo o resultado com esses 10 registros corretamente.

Mas quando estou tentando excluir esses registros por

Select * from tbl1 WHERE [TextCol] NOT LIKE '%TAX%'

está retornando 100 registros apenas, em vez de 190.

58
Shanka

Isso retorna o resultado correto?

Select * from tbl1 WHERE COALESCE([TextCol],'-1') NOT LIKE '%TAX%'

Acredito que os valores de NULL são o problema aqui, se a coluna os contiver, então NULL NOT LIKE '%TAX%' retornará UNKNOWN/NULL e, portanto, não será selecionado.

Eu aconselho você a ler sobre manipulação com valores de NULL , ou aqui .

Como sugerido pelo @ughai, se o desempenho é um problema, você também pode usar:

  Select * from tbl1 
  WHERE [TextCol] NOT LIKE '%TAX%'
     OR [TextCol] IS NULL
73
sagi

(A) Os operadores de comparação SQL resultam em três valores possíveis: Verdadeiro, Falso e Desconhecido. Se um ou ambos os operandos forem NULL, o resultado será Desconhecido. Considere o exemplo a seguir, onde comparamos alguns valores (a idade de uma pessoa) com uma constante (18):

21   >= 18 -- True
15   >= 18 -- False
NULL >= 18 -- Unknown

Como você pode ver, o banco de dados pode/não irá decidir se NULL é maior que/igual a 18.

(B) O banco de dados retornará apenas as linhas nas quais a cláusula WHERE é avaliada como True. A inversão da expressão (por exemplo, WHERE age >= 18 alterado para WHERE age < 18) não afeta os resultados Desconhecidos.

Você pode usar o IS [NOT] NULL para corresponder aos valores NULL. A consulta a seguir selecionará as linhas nas quais a coluna não corresponde ao padrão OR, a coluna é NULL:

WHERE [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL

Funções como ISNULL e COALESCE podem ser usadas para transformar NULL em algum valor.

18
Salman A

Aconteceu comigo uma vez também! Depois de quebrar a cabeça em torno dele eu descobri que era por causa de valores nulos, então você pode usar essa consulta para evitá-lo:

WHERE CASE WHEN [TextCol] IS NULL
           THEN 'default' 
           ELSE [TextCol] 
      END NOT LIKE '%TAX%'
2
infectious
  1. Select * from tbl1 
    WHERE ([TextCol] NOT LIKE '%TAX%') AND ([TextCol] NOT LIKE '%TAX%')
    
  2. select * from tbl1
    where [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
    
1
Chanukya

Você precisa verificar os valores NULL também:

    [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL

Isso também deve cuidar de valores nulos, o que provavelmente explica por que você não obteve todas as linhas na saída.

0
Yossi Orsen

Eu tive o mesmo problema com o operador IN na coluna int simples com nulos. Eu achei que estes onde não cada um dos outros inverso como eu pensava. (Eu poderia dizer pela contagem de linhas) 

select * from Dest where id in(select id from Source)
select * from Dest where id NOT in(select id from Source)

Para fazer com que os outros se invertessem, eu os reescrevi também:

select * from Dest where isnull(id,-2)  in(select isnull(id,-1) from Source) 
select * from Dest where isnull(id,-2) NOT in(select isnull(id,-1) from Source) 
0
Tomas Hesse