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 / 253247
Accepted
Jana
Jana
Asked: 2019-11-14 23:53:31 +0800 CST2019-11-14 23:53:31 +0800 CST 2019-11-14 23:53:31 +0800 CST

Como evitar toneladas de lower (coluna) na cláusula WHERE para várias comparações LIKE?

  • 772

Eu tenho que filtrar dados em uma coluna de string e, portanto, preciso comparar a coluna usando NOT LIKEum monte de strings.

Estou usando o SQL Server e meu código está assim:

SELECT history.date,
       history.new_value,
       res.resource_name
FROM   item_history history, 
       owned_resource   res
WHERE  (history.attr_name = 'resource_contact' OR history.attr_name = 'Kontakt-UUID')
       AND res.inactive = 0 
       AND history.com_par_id = res.own_resource_uuid
       AND lower(history.new_value) NOT LIKE '%tp für%'
       AND lower(history.new_value) NOT LIKE '%rücklieferung%'
       AND lower(history.new_value) NOT LIKE '%rückläufer%'
       AND lower(history.new_value) NOT LIKE '%stoerreserve%'
       AND lower(history.new_value) NOT LIKE '%zentrallager%'
       AND lower(history.new_value) NOT LIKE '%bhs-pool%'
       AND lower(history.new_value) NOT LIKE '%lager halle%'        
       AND lower(history.new_value) NOT LIKE '%lager logistik%'
       AND lower(history.new_value) NOT LIKE 'reserve %'
       AND lower(history.new_value) NOT LIKE '%igeko%bhs%'
       AND lower(history.new_value) NOT LIKE '%service%ecg%'
       AND lower(history.new_value) NOT LIKE '%multifunktionsdrucker%'
       AND lower(history.new_value) NOT LIKE 'nn%gisa%raum%'
       AND lower(history.new_value) NOT LIKE '%citrix%admins%'
       AND lower(history.new_value) NOT LIKE '%personalwesen%'
       AND lower(history.new_value) NOT LIKE '%etagendrucker%'
       AND lower(history.new_value) NOT LIKE '%schulungsraum%'
       AND lower(history.new_value) NOT LIKE '%team%raum%'
       AND lower(history.new_value) NOT LIKE  '%beratungsraum%'
       AND lower(history.new_value) != 'reserve'
)

Eu acho que o desempenho não é o melhor chamando "lower()" repetidamente. Além disso, como programador, minhas unhas estão enrolando vendo tanto código redundante. Infelizmente não encontrei uma maneira legal de usar uma variável ou algo assim. (Quero acrescentar que não posso simplesmente adicionar uma nova coluna computada, o que seria uma boa maneira aqui, estou autorizado apenas a ler dados.)

Qualquer conselho para tornar o código mais inteligente seria apreciável?

sql-server where
  • 3 3 respostas
  • 83 Views

3 respostas

  • Voted
  1. Best Answer
    Michael Cherevko
    2019-11-15T00:05:07+08:002019-11-15T00:05:07+08:00

    Eu usaria join aqui em vez da antiga maneira de escrever
    Em relação a "inferior", você tem certeza de que isso é necessário?
    Você verificou o agrupamento de new_value?
    Se tiver CI (insensível a maiúsculas e minúsculas) no nome do agrupamento, você pode evitar o uso de lower.

    Se você fizer isso, você pode escrever algo assim

    WITH cte
        AS ( SELECT history.date
                   ,history.new_value
                   ,res.resource_name
                   ,LOWER(history.new_value) AS new_value
             FROM   item_history history
             JOIN   owned_resource res
                    ON (   history.attr_name = 'resource_contact'
                           OR history.attr_name = 'Kontakt-UUID' )
                       AND res.inactive = 0
                       AND history.com_par_id = res.own_resource_uuid )
    SELECT *
    FROM   cte
    WHERE  new_value NOT LIKE '%tp für%'
           AND new_value NOT LIKE '%rücklieferung%'
           AND new_value NOT LIKE '%rückläufer%'
           AND new_value NOT LIKE '%stoerreserve%'
           AND new_value NOT LIKE '%zentrallager%'
           AND new_value NOT LIKE '%bhs-pool%'
           AND new_value NOT LIKE '%lager halle%'
           AND new_value NOT LIKE '%lager logistik%'
           AND new_value NOT LIKE 'reserve %'
           AND new_value NOT LIKE '%igeko%bhs%'
           AND new_value NOT LIKE '%service%ecg%'
           AND new_value NOT LIKE '%multifunktionsdrucker%'
           AND new_value NOT LIKE 'nn%gisa%raum%'
           AND new_value NOT LIKE '%citrix%admins%'
           AND new_value NOT LIKE '%personalwesen%'
           AND new_value NOT LIKE '%etagendrucker%'
           AND new_value NOT LIKE '%schulungsraum%'
           AND new_value NOT LIKE '%team%raum%'
           AND new_value NOT LIKE '%beratungsraum%'
           AND new_value != 'reserve';
    
    • 3
  2. Thomas Franz
    2019-11-15T06:27:32+08:002019-11-15T06:27:32+08:00

    Por uma questão de completude, você poderia ter resolvido o problema (muitas exclusões) da seguinte maneira também:

    SELECT history.date
         , history.new_value
         , res.resource_name
      FROM item_history        AS history
     INNER JOIN owned_resource AS res
        ON history.com_par_id = res.own_resource_uuid
       AND res.inactive       = 0
     WHERE (history.attr_name = 'resource_contact' OR history.attr_name = 'Kontakt-UUID')
       AND NOT EXISTS
         (SELECT *
            FROM (VALUES ('%tp für%')
                       , ('%rücklieferung%')
                       , ('%rückläufer%')
                       , ('%stoerreserve%')
                       , ('%zentrallager%')
                       , ('%bhs-pool%')
                       , ('%lager halle%')
                       , ('%lager logistik%')
                       , ('reserve %')
                       , ('%igeko%bhs%')
                       , ('%service%ecg%')
                       , ('%multifunktionsdrucker%')
                       , ('nn%gisa%raum%')
                       , ('%citrix%admins%')
                       , ('%personalwesen%')
                       , ('%etagendrucker%')
                       , ('%schulungsraum%')
                       , ('%team%raum%')
                       , ('%beratungsraum%')
                       , ('reserve')) AS ex (exclude)
           WHERE history.new_value LIKE ex.exclude);
    

    PS: Eu não gosto dos JOINs de estilo de vírgula da velha escola oracle e fora do padrão ANSI ...

    • 1
  3. pncsoares
    2019-11-15T00:45:35+08:002019-11-15T00:45:35+08:00

    Com base na minha experiência, usar funções SQL em condições WHERE é ruim para o desempenho do SQL.

    Você pode reescrever seu script para fazer o seguinte:

    1. Criar uma tabela temporária ou tabela variável
    2. INSERT INTO SELECT para essa tabela temporária ou variável, mas no SELECT use o lower() para a coluna que você está usando atualmente na condição WHERE.
    3. SELECIONE [colunas] DA tabela temporária ou variável.
    • 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