Eu tenho que filtrar dados em uma coluna de string e, portanto, preciso comparar a coluna usando NOT LIKE
um 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?
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
Por uma questão de completude, você poderia ter resolvido o problema (muitas exclusões) da seguinte maneira também:
PS: Eu não gosto dos JOINs de estilo de vírgula da velha escola oracle e fora do padrão ANSI ...
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: