AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 138800
Accepted
GWR
GWR
Asked: 2016-05-18 12:42:38 +0800 CST2016-05-18 12:42:38 +0800 CST 2016-05-18 12:42:38 +0800 CST

Comportamento estranho da cláusula WHERE. Por que isso retorna uma linha?

  • 772

No SQL Server 2008, por que isso retorna a linha, mesmo quando adiciono um espaço em branco, ou dois, ou mais, ao final da cláusula where? registros zero não deveriam ser encontrados no exemplo a seguir?

WITH SRC AS (SELECT cast('12345' as varchar) DEMO)
SELECT * FROM SRC WHERE DEMO='12345  '

E se alguém precisar consultar para encontrar, '1234 'mas não'1234'

sql-server
  • 4 4 respostas
  • 316 Views

4 respostas

  • Voted
  1. Best Answer
    Eric S
    2016-05-18T12:56:31+08:002016-05-18T12:56:31+08:00

    O que está acontecendo é que o SQL preenche os espaços no final das strings para que tenham o mesmo comprimento. Então, se você tentar fazer algo como:

    SELECT 1 WHERE '' = ' ' 
    

    Na verdade, você receberá 1 de volta, embora não sejam iguais. No entanto, se você fizer algo como:

    SELECT 1 WHERE 'a' = ' a'
    

    Ele não retornará nada, pois estaria comparando 'a' com 'a' que não correspondem.

    No entanto, isso retornaria 1:

    SELECT 1 WHERE 'a' = 'a '
    

    Como está comparando 'a' com 'a'

    • 10
  2. Paul White
    2016-05-20T10:23:45+08:002016-05-20T10:23:45+08:00

    E se alguém precisar consultar para encontrar '1234', mas não '1234'

    Se você estiver usando dados Unicode, basta usar LIKE. Da documentação :

    Quando todos os argumentos ( match_expression, pattern e escape_character , se presentes) são tipos de dados de caracteres ASCII, a correspondência de padrão ASCII é executada. Se qualquer um dos argumentos for do tipo de dados Unicode, todos os argumentos serão convertidos em Unicode e a correspondência de padrão Unicode será executada. Quando você usa dados Unicode ( tipos de dados nchar ou nvarchar ) com LIKE, os espaços em branco à direita são significativos; no entanto, para dados não Unicode, os espaços em branco à direita não são significativos. O Unicode LIKE é compatível com o padrão ISO. ASCII LIKE é compatível com versões anteriores do SQL Server.

    Com dados não Unicode, você ainda pode obter o LIKEcomportamento Unicode, ao custo de algumas conversões implícitas (observe que o LIKEpadrão na segunda consulta tem um 'N' inicial, denotando uma string Unicode literal):

    DECLARE @T AS table 
    (
        pk integer IDENTITY PRIMARY KEY,
        v varchar(10) NOT NULL,
        UNIQUE (v, pk)
    );
    
    INSERT @T (v) 
    VALUES 
        ('1234'), 
        ('1234' + SPACE(1)),
        ('1234' + SPACE(2)),
        ('1234' + SPACE(3));
    
    SELECT REPLACE(T.v, SPACE(1), '@')
    FROM @T AS T 
    WHERE T.v LIKE '1234 ';
    
    SELECT REPLACE(T.v, SPACE(1), '@')
    FROM @T AS T 
    WHERE T.v LIKE N'1234 ';
    

    Resultados:

    Resultados

    O código com a conversão implícita ainda pode usar um índice, por meio da mágica da geração de busca dinâmica :

    Plano

    • 7
  3. Solomon Rutzky
    2016-05-18T15:58:45+08:002016-05-18T15:58:45+08:00

    Em relação à seguinte parte da pergunta:

    E se alguém precisar consultar para encontrar '1234', mas não '1234'

    Parece que usar um Collation binário (ou seja, um que termina em _BIN2) não funciona para isso, mas você também pode comparar DATALENGTHos dois valores:

    SET NOCOUNT ON;
    DECLARE @T TABLE (Col1 VARCHAR(10));
    INSERT INTO @T (Col1) VALUES ('12345  ');
    INSERT INTO @T (Col1) VALUES ('12345');
    
    SELECT DATALENGTH(Col1) AS [Col1Bytes], '~' + Col1 + '~' AS [Col1] FROM @T;
    
    SELECT DATALENGTH(Col1) AS [Col1Bytes], '~' + Col1 + '~' AS [Col1] FROM @T
    WHERE Col1 = '12345  '
    AND   DATALENGTH(Col1) = DATALENGTH('12345  ');
    

    Retorna:

    Col1Bytes    Col1
    7            ~12345  ~
    5            ~12345~
    
    Col1Bytes    Col1
    7            ~12345  ~
    
    • 5
  4. Riley Major
    2016-05-19T13:26:27+08:002016-05-19T13:26:27+08:00

    Uma alternativa à resposta de srutzky para a parte "e se" da pergunta:

    E se alguém precisar consultar para encontrar '1234', mas não '1234'

    Apenas certifique-se de que os últimos caracteres do que você está comparando não sejam espaços em branco.

    SELECT      *
    FROM        (
                                SELECT CONVERT(VARCHAR(50),'1234 ') AS TestVal
                    UNION ALL   SELECT CONVERT(VARCHAR(50),'1234')
                ) AS TestTable
    WHERE       TestTable.TestVal = '1234 '
    AND         TestTable.TestVal + '.' = '1234 ' + '.';
    

    É melhor manter ambas as condições na cláusula WHERE (a comparação direta e a comparação calculada) para preservar o uso do índice.

    • 4

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve