Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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..
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
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)
>
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
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
mto bem lembrado Felipe. TO_NUMBER()…
not in é até válido, desde que seja permitido.
flag_teste é varchar?