Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

KUROL3

Campo <> 1 -- nao acha nada

Recommended Posts

Olá gostaria de entender pq o sqlserver se comporta assim:

 

 

tenho os registros nos bancos

 

id = 1

flag_teste = NULL

 

id = 2

flag_teste = 0

id = 3

flag_teste = 1

 

id = 4

flag_teste = NULL

 

//quando eu faço

select * from minha_table where flag_teste <> 1;

 

nao acha nada

so acha se eu fizer assim

 

select * from minha_table where flag_teste is null or flag_teste = 0;

 

alguem saberia me explicar..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que eu me lembre, tinha uma correcao no SQL2005 que tirava este problema. Eu não consegui achar uma documentação oficial sobre o caso.

 

Na teoria e no SQL2008 não há distinção entre quando se tem somente números neste campo:

Por exemplo:

IF OBJECT_ID ('TEMPDB..#TABLE') IS NOT NULL
DROP TABLE #TABLE

CREATE TABLE  #TABLE (ID INT, FLAG_TESTE VARCHAR(10) )

INSERT INTO #TABLE (ID, FLAG_TESTE)
SELECT 0, 00

INSERT INTO #TABLE 
SELECT 1, NULL

INSERT INTO #TABLE 
SELECT 2, 0

INSERT INTO #TABLE 
SELECT 3, 1

INSERT INTO #TABLE 
SELECT 4, NULL

INSERT INTO #TABLE 
SELECT 1, NULL

SELECT * FROM #TABLE
SELECT * FROM #TABLE  WHERE FLAG_TESTE <> 1;

Ele traz os dados que tem no where, msm o campo FLAG_TESTE sendo do tipo char (pode ser varchar, nvarchar, nchar).

 

a única excessão e gera erro, seria quando se tem texto no campo:

 

IF OBJECT_ID ('TEMPDB..#TABLE') IS NOT NULL
DROP TABLE #TABLE

CREATE TABLE  #TABLE (ID INT, FLAG_TESTE VARCHAR(10) )

INSERT INTO #TABLE (ID, FLAG_TESTE)
SELECT 0, 'xx'

INSERT INTO #TABLE (ID, FLAG_TESTE)
SELECT 0, 00

INSERT INTO #TABLE 
SELECT 1, NULL

INSERT INTO #TABLE 
SELECT 2, 0

INSERT INTO #TABLE 
SELECT 3, 1

INSERT INTO #TABLE 
SELECT 4, NULL

INSERT INTO #TABLE 
SELECT 1, NULL

SELECT * FROM #TABLE
SELECT * FROM #TABLE  WHERE FLAG_TESTE <> 1;

erro:

Msg 245, Level 16, State 1, Line 28

Conversion failed when converting the varchar value 'xx' to data type int.

 

Ai, neste caso, teria que colocaro o where deste modo:

WHERE FLAG_TESTE <> '1'

Com aspas!

 

Verifique se eh o seu caso.

 

Outra coisa que me lembrei. Quais as propriedades da tabela? Com relação a Collation? TrimTrailingBlanks? E qual o formato do campo?

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

o campo eu deixei smallint

 

a versão do sql é:

 

Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) Sep 21 2011 22:45:45 Copyright © 1988-2008 Microsoft Corporation Web Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Compartilhar este post


Link para o post
Compartilhar em outros sites

o campo eu deixei smallint

 

a versão do sql é:

 

Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) Sep 21 2011 22:45:45 Copyright © 1988-2008 Microsoft Corporation Web Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

 

Para verificar a versão do seu SQL, surgiro utilizar a função SERVERPROPERTY que pode ser vista no tópico abaixo:

http://forum.imasters.com.br/topic/395859-versao-correta-do-sql/

 

Mesmo o campo sendo smallint, ele deveria trazer sim. Os services packs estão corretamente aplicados? O collation da tabela, neste campo esta igual ao da database?

 

Abçs

 

ah!

 

e se você rodar o exemplo que postei, os dados retornam da tabela temporaria?

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Concordo com Ajr, acho que se colocar:

WHERE FLAG_TESTE <> '1' funciona.

Se não funcionar mesmo não gostando de usar o IN. Tenta:

WHERE TO_NUMBER(FLAG_TESTE) NOT IN (1)

 

 

Atenciosamente

Felipe Filho

Skype: felipe.calixto

Site: sawicontroladoria.tk

Blog: sawiblog.sytes.net

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.