在 LIKE 运算符中选择多个值

l.l*_*ith 16 sql-server-2008 sql-server operator like

我有下面给出的 SQL 查询,我想使用like运算符选择多个值。

我的查询正确吗?

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
Run Code Online (Sandbox Code Playgroud)

如果没有,有人可以纠正我吗?

我的表有大量以'emp1'和开头的数据'emp3'。我可以根据前 3 个“emp1”和前 2 个“emp3”过滤结果rx_dt吗?

And*_*y M 22

或者,您可以尝试以下方法:

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
;
Run Code Online (Sandbox Code Playgroud)

VALUES行表示构造你的模式列表,表,另外与行数提供每个图案以检索模式。CROSS APPLY 运算符将您的查询应用于模式列表的每一行,即每个模式,将每个模式的行数限制为模式列表中的相应值。

作为旁注,请让我借此机会建议您在从两个或多个表中读取的查询中始终使用表别名来限定您的列。这使您的查询更易于阅读/理解。您始终可以使用短别名来避免重复可能很长的表名。例如:

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
  ...
Run Code Online (Sandbox Code Playgroud)


McN*_*ets 12

您应该使用 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;
Run Code Online (Sandbox Code Playgroud)

看看MS-Docs 上的OR (Transact-SQL)

我已经建立了一个例子:

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
Run Code Online (Sandbox Code Playgroud)
SELECT employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp1%'
OR     employee_id LIKE 'emp3%';
GO
Run Code Online (Sandbox Code Playgroud)
员工_id | 员工姓名  
:---------- | :--------------
emp10 | 布莱恩·纳尔逊   
emp12 | 罗莎琳·桑德斯
emp13 | 罗斯·图德勒    
emp30 | 伊恩·麦格雷戈   

请记住,您使用的是 TOP 1,无论您使用多少条件,您都将获得最多一行。

SELECT TOP 1 employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp1%'
OR     employee_id LIKE 'emp3%';
GO
Run Code Online (Sandbox Code Playgroud)
员工_id | 员工姓名
:---------- | :------------
emp10 | 布莱恩·纳尔逊

如果您需要 TOP (X) 行WHERE employee_id LIKE 'emp1%'加上 TOP (X) 行,WHERE employee_id LIKE 'emp3%'您可以使用两个与 UNION ALL 连接的 select 语句。

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
Run Code Online (Sandbox Code Playgroud)
员工_id | 员工姓名  
:---------- | :--------------
emp10 | 布莱恩·纳尔逊   
emp12 | 罗莎琳·桑德斯
emp13 | 罗斯·图德勒    
emp30 | 伊恩·麦格雷戈   

此外,我将添加一个模式搜索,但此解决方案会返回与该模式匹配的所有记录:LIKE 'emp[13]%'

SELECT employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp[13]%'
GO
Run Code Online (Sandbox Code Playgroud)
员工_id | 员工姓名  
:---------- | :--------------
emp10 | 布莱恩·纳尔逊   
emp12 | 罗莎琳·桑德斯
emp13 | 罗斯·图德勒    
emp30 | 伊恩·麦格雷戈   

dbfiddle在这里