Saltar al contenido

Seleccione varios valores en el operador LIKE

Solución:

Alternativamente, puede probar el siguiente método:

SELECT
  x.*
FROM
  (
    VALUES
      ('emp1%', 3),
      ('emp3%', 2)
  ) AS v (pattern, row_count)
  CROSS APPLY
  (  -- your query
    SELECT top (v.row_count)
               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 v.pattern
    ORDER BY   rx_dt desc
  ) AS x
;

los VALUES El constructor de filas representa su lista de patrones como una tabla, y además proporciona a cada patrón el número de filas a recuperar para ese patrón. El operador CROSS APPLY aplica su consulta a cada fila de la lista de patrones, es decir, a cada patrón, limitando el número de filas para cada patrón al valor correspondiente de la lista de patrones.

Como nota al margen, permítame aprovechar esta oportunidad para sugerir que siempre califique sus columnas con el alias de la tabla en una consulta que esté leyendo de dos o más tablas. Eso hace que su consulta sea más fácil de leer / comprender. Siempre puede usar alias cortos para evitar la repetición de nombres de tablas potencialmente largos. Por ejemplo:

SELECT TOP (1)
  e.employee_id,
  h.employee_ident,
  ...
FROM
  dbo.employee AS e
  INNER JOIN dbo.employee_mdata_history AS h
    ON e.ident = h.employee_ident
WHERE
  e.employee_id LIKE ...
ORDER BY
  ...

Debe utilizar una condición OR / AND:

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%' 
OR         employee_id like 'emp3%' 
ORDER BY   rx_dt desc;

Eche un vistazo a OR (Transact-SQL) en MS-Docs.

He creado un ejemplo:

create table employees(employee_id varchar(10), employee_name varchar(100));

insert into employees values
('emp10', 'Bryan Nelson'),
('emp12', 'Rosalyn Sanders'),
('emp13', 'Rose Tudler'),
('emp20', 'Julio Gomez'),
('emp30', 'Ian McGregor'),
('emp40', 'Anne Hatt');
GO
SELECT employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp1%'
OR     employee_id LIKE 'emp3%';
GO
employee_id | employee_name  
:---------- | :--------------
emp10       | Bryan Nelson   
emp12       | Rosalyn Sanders
emp13       | Rose Tudler    
emp30       | Ian McGregor   

Tenga en cuenta que está usando TOP 1, obtendrá una fila como máximo, sin importar cuántas condiciones use.

SELECT TOP 1 employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp1%'
OR     employee_id LIKE 'emp3%';
GO
employee_id | employee_name
:---------- | :------------
emp10       | Bryan Nelson 

Si necesita las filas TOP (X) WHERE employee_id LIKE 'emp1%' más filas TOP (X) WHERE employee_id LIKE 'emp3%' puede utilizar dos sentencias de selección unidas a UNION ALL.

SELECT TOP 3 employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp1%'
UNION ALL
SELECT TOP 1 employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp3%'
GO
employee_id | employee_name  
:---------- | :--------------
emp10       | Bryan Nelson   
emp12       | Rosalyn Sanders
emp13       | Rose Tudler    
emp30       | Ian McGregor   

Además, agregaré una búsqueda de patrón, pero esta solución devuelve todos los registros que coinciden con el patrón: LIKE ’emp[13]% ‘

SELECT employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp[13]%'
GO
employee_id | employee_name  
:---------- | :--------------
emp10       | Bryan Nelson   
emp12       | Rosalyn Sanders
emp13       | Rose Tudler    
emp30       | Ian McGregor   

dbfiddle aquí

Supongo que quieres 1 fila where employee_id like 'emp1%' y otro where employee_id like 'emp3%'. Una forma de lograrlo es utilizar un union:

SELECT t1.*
FROM
  ( SELECT top 1 employee_id, employee_ident, utc_dt, rx_dt 
    FROM       employee
    JOIN employee_mdata_history 
        ON employee.ident=employee_mdata_history.employee_ident 
    WHERE employee_id like 'emp1%'
    ORDER BY rx_dt desc
  ) AS t1
UNION ALL
SELECT t2.*
FROM
  (  SELECT top 1 employee_id, employee_ident, utc_dt, rx_dt 
    FROM       employee
    JOIN employee_mdata_history 
        ON employee.ident=employee_mdata_history.employee_ident 
    WHERE employee_id like 'emp3%'
    ORDER BY rx_dt desc
  ) AS t2 ;

Dado que se garantiza que las piernas en la unión estarán separadas un UNION ALL se puede usar, y eso podría ser una ventaja de rendimiento en comparación con el uso de solo un UNION.

Creo que SQL-server 2008 admite funciones de ventana como row_number (), por lo que puede usar algo como:

SELECT employee_id, employee_ident, utc_dt, rx_dt
FROM (
    SELECT employee_id, employee_ident, utc_dt, rx_dt
      , row_number() over (partition by substring(employee_id,1,4)
                           order by rx_dt desc) as rn 
    FROM employee
    JOIN employee_mdata_history 
        ON employee.ident = employee_mdata_history.employee_ident 
    WHERE employee_id like 'emp1%' 
       OR employee_id like 'emp3%'
) as T 
WHERE rn = 1 
ORDER BY rx_dt desc;
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *