【问题标题】:SQL Server 2012 - search nvarchar field for > 1 like matchesSQL Server 2012 - 在 nvarchar 字段中搜索 > 1 个类似的匹配项
【发布时间】:2025-11-28 07:15:01
【问题描述】:

假设我有一列包含名为“Data”的字符串(定义为 nvarchar(MAX))

数据包含以下单元格:

-------------------------------------
|                data                |
--------------------------------------
| "test data #item test data #match" |
-------------------------------------
| "test data #test"                  |
-------------------------------------

我想创建一个使用#{something} 搜索出现的查询。但是,查询返回出现次数为 2 或更多的行。所以会返回:

-------------------------------------
|                data                |
--------------------------------------
| "test data #item test data #match" |
-------------------------------------

因为有两个标签项:

例如

SELECT * FROM table WHERE data LIKE '%#% AND COUNT > 2 

我将如何编写这样的查询?

【问题讨论】:

  • 统计字符串中的#

标签: sql-server sql-server-2012


【解决方案1】:

您可以通过DATALENGTH (difference LEN vs. DATALENGTH) 使用以下解决方案:

SELECT * FROM table_name 
WHERE (DATALENGTH(data) - DATALENGTH(REPLACE(data, '#', ''))) / DATALENGTH('#') >= 2

demo on dbfiddle.uk


您还可以在 T-SQL 上create a function 以获得更小的查询(以及更好的重用):

-- create the function GetStringCount
CREATE FUNCTION GetStringCount(@strValue VARCHAR(200), @charValue VARCHAR(200))
RETURNS INT
AS
BEGIN
  RETURN (DATALENGTH(@strValue) - DATALENGTH(REPLACE(@strValue, @charValue, ''))) / DATALENGTH(@charValue)
END

-- use the function GetStringCount
SELECT * FROM table_name WHERE dbo.GetStringCount(data, '#') >= 2

【讨论】:

    【解决方案2】:
    select * from your_table
    where len(data) - len(replace(data, '#', '')) >= 2
    

    Demo

    【讨论】:

    • 您的语句中有语法错误,可能需要编辑
    最近更新 更多