我有一个下面给出的 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
如果没有,有人可以纠正我吗?
我的表有大量以'emp1'
and开头的数据'emp3'
。我可以根据前 3 个“emp1”和前 2 个“emp3”过滤结果rx_dt
吗?
或者,您可以尝试以下方法:
行构造函数将
VALUES
您的模式列表表示为一个表格,另外为每个模式提供要为该模式检索的行数。CROSS APPLY 运算符将您的查询应用于模式列表的每一行,即每个模式,将每个模式的行数限制为模式列表中的相应值。作为旁注,请让我借此机会建议您始终使用从两个或多个表读取的查询中的表别名来限定列。这使您的查询更易于阅读/理解。您始终可以使用短别名来避免重复可能很长的表名。例如:
您应该使用 OR/AND 条件:
查看 MS-Docs 上的OR (Transact-SQL)。
我已经建立了一个例子:
请记住,您使用的是 TOP 1,无论您使用多少个条件,您都将获得最多一行。
如果您需要 TOP (X) 行
WHERE employee_id LIKE 'emp1%'
加上 TOP (X) 行WHERE employee_id LIKE 'emp3%'
,您可以使用两个与 UNION ALL 连接的 select 语句。此外,我将添加模式搜索,但此解决方案返回与模式匹配的所有记录:LIKE 'emp[13]%'
dbfiddle在这里
我猜你想要 1 行
where employee_id like 'emp1%'
和另一个where employee_id like 'emp3%'
. 实现此目的的一种方法是使用union
:由于保证联合中的腿是不相交的
UNION ALL
,因此可以使用 a ,与仅使用 a 相比,这可能是性能优势UNION
。我相信 SQL-server 2008 支持像 row_number() 这样的窗口函数,所以你可以使用类似的东西:
这是一个很好的论据。如果您需要字符串的所有单词出现在表格的字段中,您可以使用下面找到的选择。该查询使用 PATINDEX 语句,如您所知,该语句仅在字符串中的单词与搜索字段的顺序相同时才有效。实际上,PATINDEX 的两个段是先排序后聚合的。前提是存在一个表函数(splitstring_ex),它返回一个记录列表......因此是一个微不足道的拆分。
您正在使用
TOP(1)
andorder by
子句。因此,您将仅获得该子句排序的第一个顶级记录。