Pergunta

Eu tive um requisito para criar uma consulta no SQL Server onde a condição de pesquisa incluiria / excluir uma tabela com base na entrada do usuário.

Say Eu tenho duas tabelas, TABLE_A e TABLE_B com colunas KEYCOLUMN_A e COLUMN_A em TABLE_A e colunas FKCOLUMN_B e COLUMN_B em TABLE_B.

E uma consulta como:

SELECT TABLE_A.* FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
AND TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '%SEARCH2%'

Agora, se o usuário não entrada SEARCH2, eu não preciso de pesquisa TABLE_B. Mas isso significaria uma cláusula IF ELSE. E como o número de mesas "opcionais" na consulta aumenta, as permutações e combinações também iria aumentar e haverá muitas declarações IF e ELSE.

Em vez disso, decidiu manter a declaração como ela é. Então, se SEARCH2 está vazia, a consulta irá efetivamente se tornar:

SELECT * FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
AND TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '% %'

Pode o SQL otimizador de reconhecer que LIKE %% é tão boa como a remoção da própria condição?

Foi útil?

Solução

Enrole uma OR em torno de sua mesa "B", tais como:

AND (len(searchString)=0 OR table_b.column_b LIKE "%searchString%" )

Desta forma, se nenhum valor para a cadeia, seu comprimento seria zero, ea primeira parte do OR seria avaliado, sempre voltar como verdadeira e devolver a parte da equação como válida e ignorar a outra metade usando a cláusula LIKE.

Você pode aplicar o mesmo para o maior número de tabelas vinculadas como você precisa.

Outras dicas

A primeira coisa, você tem um espaço no seu exemplo:

AND TABLE_B.COLUMN_B LIKE '% %'

Isso nunca será otimizado como ele é realmente uma condição significativa.

Agora, eu acho que, se ele é otimizado afastado depende do motor de banco de dados e quão inteligente ela é.

Por exemplo, SQL Server 2005 faz oferta o mesmo plano de execução para os dois tipos de consultas, enquanto MySQL 5.0.38 não.

LIKE é usado com a cláusula WHERE para pesquisar, atualizar e excluir um registro usando cartões selvagens.

Exemplo:

Para pesquisar todos os registros cujo nome empregado é estrelado de um personagem, 'a':

select * from Employee where Name like 'a%'

Para atualizar todos os registros com o nome Amit , cujo nome empregado está começando com um personagem, 'a':

update Employee set Name='amit' where Name like 'a%'

Para excluir todos os registros cujo nome empregado está começando com um personagem, 'a':

delete from Employee  where Name like 'a%'

O operador LIKE é usado em uma cláusula WHERE para pesquisar um padrão especificado em uma coluna

LIKE '%[p-s]'  -- "It search data from table parameter where sentence ending with p,q,r,s word."
LIKE '[0-9]' --It use for search only numeric value
LIKE '%table%' -- it use for search parameter from table where use "table" keyword'.
LIKE %[^p-r]  -- it set the condition where Not Ending With a Range of Characters

Example: 
SELECT T1.BrandName,T1.BrandID,T2.CategoryName,T2.Color FROM TABLE1 T1 
        LEFT JOIN TABLE2 T2 on T1.ID  = T2.BrandID
        WHERE T1.BrandName LIKE '%Samsung%'
Example: 
SELECT T1.BrandName,T1.BrandID,T2.CategoryName,T2.Color FROM TABLE1 T1 
        LEFT JOIN TABLE2 T2 on T1.ID  = T2.BrandID
        WHERE T1.BrandName LIKE '%[a-j]'

Na MySQL você também pode usar ILIKE, e então é caso insensível.

Você pode reescrever você consulta como esta:

SELECT TABLE_A.* FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
AND (@paramA='' or TABLE_A.COLUMN_A LIKE '%' + @paramA + '%')
AND (@paramB='' or TABLE_B.COLUMN_B LIKE '%' + @paramB + '%')

Desta forma, se paramA ou paramB é '', então a outra coluna que é consultado dentro mesmos parênteses não será consultado.

Use UNIÃO e adequada JOINs.

O termo% foo% busca é ruim o suficiente (não pode usar o índice), sem acrescentar OR e LEN à mistura também.

SELECT
    TABLE_A.*
FROM
    TABLE_A
    JOIN
    TABLE_B On TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
WHERE
    TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '%SEARCH2%'
UNION
SELECT
    TABLE_A.*
FROM
    TABLE_A
WHERE
    TABLE_A.COLUMN_A LIKE '%SEARCH%'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top