Eu tenho uma consulta SQL abaixo, quero selecionar vários valores usando o like
operador.
Minha consulta está correta?
SELECT top 1 employee_id, employee_ident, utc_dt, rx_dt
FROM employee
INNER JOIN employee_mdata_history
ON employee.ident=employee_mdata_history.employee_ident
WHERE employee_id like 'emp1%' , 'emp3%'
ORDER BY rx_dt desc
Se não, alguém pode me corrigir?
Minha tabela tem uma grande quantidade de dados começando com 'emp1'
e 'emp3'
. Posso filtrar o resultado por top 3 "emp1" e top 2 "emp3" com base em rx_dt
?
Alternativamente, você pode tentar o seguinte método:
O
VALUES
construtor de linha representa sua lista de padrões como uma tabela, fornecendo adicionalmente a cada padrão o número de linhas a serem recuperadas para esse padrão. O operador CROSS APPLY aplica sua consulta a cada linha da lista de padrões, ou seja, a cada padrão, limitando o número de linhas de cada padrão ao valor correspondente da lista de padrões.Como observação lateral, deixe-me aproveitar esta oportunidade para sugerir que você sempre qualifique suas colunas com o alias da tabela em uma consulta que está lendo de duas ou mais tabelas. Isso torna sua consulta mais fácil de ler/compreender. Você sempre pode usar aliases curtos para evitar a repetição de nomes de tabela potencialmente longos. Por exemplo:
Você deve usar uma condição OR/AND:
Dê uma olhada em OR (Transact-SQL) em MS-Docs.
Montei um exemplo:
Tenha em mente que você está usando o TOP 1, você obterá no máximo uma linha, não importa quantas condições você use.
Se você precisar das linhas TOP (X)
WHERE employee_id LIKE 'emp1%'
mais as linhas TOP (X)WHERE employee_id LIKE 'emp3%'
, você pode usar duas instruções select unidas com UNION ALL.Além disso, adicionarei uma pesquisa de padrão, mas esta solução retorna todos os registros que correspondem ao padrão: LIKE 'emp[13]%'
dbfiddle aqui
Eu acho que você quer 1 linha
where employee_id like 'emp1%'
e outrawhere employee_id like 'emp3%'
. Uma maneira de conseguir isso é usar umunion
:Uma vez que as pernas na união são garantidamente disjuntas
UNION ALL
, pode ser usado, e isso pode ser uma vantagem de desempenho em comparação com o uso de apenas umUNION
.Acredito que o SQL-server 2008 suporta funções de janela como row_number(), então você pode usar algo como:
este é um bom argumento. Caso você precise que todas as palavras da string estejam presentes em um campo de uma tabela, você pode usar o select que você encontra abaixo. A consulta usa a instrução PATINDEX que, como você sabe, só funciona se as palavras na string estiverem na mesma ordem do campo de pesquisa. De fato, os dois segmentos do PATINDEX são primeiro classificados e depois agregados. A pré-condição é a existência de uma função de tabela (splitstring_ex) que retorna uma lista de registros... daí uma divisão trivial.
Você está usando
TOP(1)
eorder by
cláusula. Portanto, você obterá apenas o primeiro registro superior ordenado pela cláusula.