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)。
我已经建立了一个例子:
Run Code Online (Sandbox Code Playgroud)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
员工_id | 员工姓名 :---------- | :-------------- emp10 | 布莱恩·纳尔逊 emp12 | 罗莎琳·桑德斯 emp13 | 罗斯·图德勒 emp30 | 伊恩·麦格雷戈
请记住,您使用的是 TOP 1,无论您使用多少条件,您都将获得最多一行。
Run Code Online (Sandbox Code Playgroud)SELECT TOP 1 employee_id, employee_name FROM employees WHERE employee_id LIKE 'emp1%' OR employee_id LIKE 'emp3%'; GO
员工_id | 员工姓名 :---------- | :------------ emp10 | 布莱恩·纳尔逊
如果您需要 TOP (X) 行WHERE employee_id LIKE 'emp1%'
加上 TOP (X) 行,WHERE employee_id LIKE 'emp3%'
您可以使用两个与 UNION ALL 连接的 select 语句。
Run Code Online (Sandbox Code Playgroud)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
员工_id | 员工姓名 :---------- | :-------------- emp10 | 布莱恩·纳尔逊 emp12 | 罗莎琳·桑德斯 emp13 | 罗斯·图德勒 emp30 | 伊恩·麦格雷戈
此外,我将添加一个模式搜索,但此解决方案会返回与该模式匹配的所有记录:LIKE 'emp[13]%'
Run Code Online (Sandbox Code Playgroud)SELECT employee_id, employee_name FROM employees WHERE employee_id LIKE 'emp[13]%' GO
员工_id | 员工姓名 :---------- | :-------------- emp10 | 布莱恩·纳尔逊 emp12 | 罗莎琳·桑德斯 emp13 | 罗斯·图德勒 emp30 | 伊恩·麦格雷戈
dbfiddle在这里
归档时间: |
|
查看次数: |
245028 次 |
最近记录: |