【问题标题】:SQL Server Like QuerySQL Server 类似查询
【发布时间】:2018-04-10 08:26:25
【问题描述】:

我们如何使用like 运算符搜索表中的多个字段?

例如:

SELECT * 
FROM EMP 
WHERE ENAME LIKE ('%SCOTT%');

如果我想在单个查询中搜索多个列,如 '%SCOTT%''%ADAMS%' 等,而不使用多个 like 子句,该怎么办?

【问题讨论】:

  • 如果你有一个OR逻辑就不行,必须有多个LIKEs。我可以问一下,当查询显然是获取您想要的内容的正确方法时,您为什么不想使用多个 LIKE 子句?
  • 您将使用多个 LIKE 子句并喜欢它。 T-SQL 不是一种非常灵活的语言。您为此设计的任何“解决方法”都可能具有更差的性能。如果您在搜索文本时需要更大的灵活性,请查看full-text search 是否可能有用。
  • 感觉有一些额外的背景说明你为什么不想使用多个 LIKE 子句。您是否在寻找简洁的语法?还是您正在尝试解决更复杂的要求?
  • 您可以使用LIKE '%[SA][CD][OA][TM][TS]%' ,但这也将匹配SCAMS
  • 我不想使用多个 LIKE,因为它是动态的。我不知道会有多少搜索字符串。我的搜索参数类似于“Reddit、Twitter、MarketWatch 等......”

标签: sql-server sql-like


【解决方案1】:

作为变体))

SELECT e.*
FROM EMP e
JOIN (VALUES('SCOTT'),('ADAM')) k(Name) ON e.ENAME LIKE CONCAT('%',k.Name,'%')

如果您使用 SQL Server 2016 或更高版本,您也可以使用string_split

SELECT e.*
FROM EMP e
JOIN (SELECT value Name FROM string_split('SCOTT,ADAM',',')) k ON e.ENAME LIKE CONCAT('%',k.Name,'%')

如果您在过程中使用名称作为 varchar 参数,则第二种变体很好

CREATE PROC FindEmpByNames
  @Names varchar(200)
AS
    SELECT e.*
    FROM EMP e
    JOIN (SELECT value Name FROM string_split(@Names,',')) k ON e.ENAME LIKE CONCAT('%',k.Name,'%')
GO

测试

EXEC FindEmpByNames 'SCOTT,ADAM'

您还可以使用数据库表中的值

CREATE TABLE ParamNames(Name varchar(10))

INSERT ParamNames(Name)VALUES
('SCOTT'),
('ADAM')
-------------
SELECT e.*
FROM EMP e
JOIN ParamNames k ON e.ENAME LIKE CONCAT('%',k.Name,'%')

【讨论】:

  • 谢谢。它在“ALTER DATABASE coinfeed SET COMPATIBILITY_LEVEL = 130”之后工作
  • @Shailesh Kalasariya - 在Database Properties -> Options 中检查Compatibility level。至少必须是 SQL Server 2016
  • 它正在我的本地服务器上运行。但它无法在我的实时服务器上运行,因为我收到诸如“数据库兼容级别的有效值是 90、100 或 110”之类的错误。
  • @Shailesh Kalasariya - 我认为是 SQL Server 2012。它还没有 string_split 功能。只有第一个变体有效吗?
  • SELECT e.* FROM EMP e JOIN (VALUES('SCOTT'),('ADAM')) k(Name) ON e.ENAME LIKE CONCAT('%',k.Name,' %') 如何使用数据库表中的值?
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2019-01-07
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多