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 / 209546
Accepted
James
James
Asked: 2018-06-14 05:49:15 +0800 CST2018-06-14 05:49:15 +0800 CST 2018-06-14 05:49:15 +0800 CST

Como fazer um LIKE que não diferencia maiúsculas de minúsculas em um banco de dados que diferencia maiúsculas de minúsculas?

  • 772

Meu fornecedor exige que o banco de dados do data warehouse faça distinção entre maiúsculas e minúsculas, mas preciso fazer consultas que não diferenciam maiúsculas de minúsculas.

Em um banco de dados com distinção entre maiúsculas e minúsculas, como você escreveria isso para não diferenciar maiúsculas de minúsculas?

    Where Name like '%hospitalist%'
sql-server collation
  • 4 4 respostas
  • 81534 Views

4 respostas

  • Voted
  1. Best Answer
    Shaulinator
    2018-06-14T06:00:17+08:002018-06-14T06:00:17+08:00

    Você pode anexar um novo agrupamento à sua consulta selecionada para localizar maiúsculas ou minúsculas.

    -- Case sensitive example
    SELECT *
    FROM TABLE 
    WHERE Name collate SQL_Latin1_General_CP1_CS_AS like '%hospitalist%'
    
    -- Case insensitive example
    SELECT *
    FROM TABLE 
    WHERE Name collate SQL_Latin1_General_CP1_CI_AS like '%hospitalist%'
    

    Apenas esteja ciente dos problemas de desempenho que isso pode apresentar. Você precisará varrer o índice clusterizado para ajustar/encontrar os valores ao realizar o agrupamento. A maneira como você está escrevendo a LIKEpeça também torna a consulta não-sargável.

    Eu peguei o truque de agrupamento das aulas do Seminário SELECT de Kendra Little . Você pode encontrar informações adicionais de agrupamento de Ben Snaidero do MS SQL Tips.

    MSDN em Agrupar.

    • 26
  2. John Eisbrener
    2018-06-14T06:47:04+08:002018-06-14T06:47:04+08:00

    Embora você possa usar uma função escalar como UPPER ou LOWER e possa agrupar novamente a coluna para que não seja mais sensível a maiúsculas e minúsculas, todas essas abordagens exigem que a conversão de dados seja feita em relação aos dados de base que nunca permitirão uma busca de índice. Você também está liderando seu LIKE com um curinga, então isso não é uma preocupação para você neste cenário de qualquer maneira, mas se você já quis pesquisar a parte esquerda de uma string de maneira eficiente E permitir o otimizador para buscar através de um índice, você pode especificar sua string com colchetes ([]) da seguinte forma:

    SELECT *
    FROM TABLE 
    WHERE Name LIKE '[hH][oO][sS][pP][iI][tT][aA][lL][iI][sS][tT]%'
    

    Este exemplo ( link dbfiddle aqui ) faz um trabalho melhor ao mostrar o que quero dizer:

    CREATE TABLE #tmp_cohellation_fun
    (
            ID  INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
        ,   myValue VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CS_AS
    )
    
    -- Garbage values to represent data you don't want
    INSERT INTO #tmp_cohellation_fun
    SELECT  CAST(NEWID() AS VARCHAR(50))
    FROM master.sys.configurations t1
        CROSS JOIN master.sys.configurations t2
        CROSS JOIN master.sys.configurations t3;
    
    -- Sprinkle a little bit of good data
    INSERT INTO #tmp_cohellation_fun
            (myValue)
    VALUES  ('Apple')
        ,   ('apple')
    
    -- Another healthy helping of garbage that we don't care about
    INSERT INTO #tmp_cohellation_fun
    SELECT  CAST(NEWID() AS VARCHAR(50))
    FROM master.sys.configurations t1
        CROSS JOIN master.sys.configurations t2
        CROSS JOIN master.sys.configurations t3;
    
    -- Some more good data
    INSERT INTO #tmp_cohellation_fun
            (myValue)
    VALUES
            ('aPple')
        ,   ('APPLE')
        ,   ('APple')
    
    
    -- Final insert of garbage that we don't care about
    INSERT INTO #tmp_cohellation_fun
    SELECT  CAST(NEWID() AS VARCHAR(50))
    FROM master.sys.configurations t1
        CROSS JOIN master.sys.configurations t2
        CROSS JOIN master.sys.configurations t3
    ;
    
    -- Create a nonclustered rowstore index
    CREATE INDEX ix_myValue ON #tmp_cohellation_fun (myValue)
    ;
    
    SET STATISTICS XML ON
    ;
    
    -- Seek, but incorrect results
    SELECT  *
    FROM    #tmp_cohellation_fun
    WHERE   myValue LIKE 'apple%'
    ;
    
    -- Scan, with correct results
    SELECT  *
    FROM    #tmp_cohellation_fun
    WHERE   myValue COLLATE SQL_Latin1_General_CP1_CI_AS LIKE 'apple%'
    ;
    
    -- Seek, with correct results
    SELECT  *
    FROM    #tmp_cohellation_fun
    WHERE   myValue LIKE '[aA][pP][pP][lL][eE]%'
    ;
    
    SET STATISTICS XML OFF
    ;
    
    DROP TABLE IF EXISTS #tmp_cohellation_fun
    
    • 17
  3. BradC
    2018-06-14T06:38:59+08:002018-06-14T06:38:59+08:00

    Tanto isso quanto a COLLATEresposta afetarão o desempenho, pois tornam a consulta não-SARGable , mas a maneira mais fácil de fazer isso (como Edgar sugeriu em um comentário) é:

    WHERE LOWER(Name) LIKE '%hospitalist%' 
    

    ou

    WHERE UPPER(Name) LIKE '%HOSPITALIST%' 
    
    • 16
  4. Kasis Shrestha
    2021-10-27T03:50:10+08:002021-10-27T03:50:10+08:00

    eu preferiria converter ambos os lados das coisas para letras minúsculas ou maiúsculas. para que não tenhamos que nos preocupar com a diferenciação entre maiúsculas e minúsculas dos dados presentes dentro da tabela .

    select * from table t where UPPER(t.col1) LIKE UPPER('%TOSEARCH%');
    

    ou em java

    public List<tableEnt> findCol1FromLike(String search){
    List<tableEnt> tableEnt= (List<tableEnt> entityManager
    .createQuery("select * from table t where UPPER(t.col1) LIKE UPPER(CONCAT('%',:search,'%'))"))
    .setParaneter("search",search)
    .getResultlist();
    return tableEnt
    }
    
    • 0

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