SQL Server 基于特定列的分组依据包含值列表中的值

omhiaaxx  于 2023-02-11  发布在  其他
关注(0)|答案(1)|浏览(117)

我有一张table我的table
| 识别号|内容|
| - ------|- ------|
| 1个|您好,这是测试内容|
| 第二章|嗨,测试内容。|
我有一个具有不同值的列表= ["Hello","Hi","Yes","content"]
现在我必须在myTable-〉content column中查找值的出现,结果表在myTable-〉content column中具有值和该值的计数(myTable表的一行可以具有多个值,并使用大小写不敏感的搜索)。输出如下:
| 价值|计数|
| - ------|- ------|
| 你好|1个|
| 你好|1个|
| 是的|无|
| 内容|第二章|
我想做最佳的SQL服务器查询。

4zcjmb1e

4zcjmb1e1#

假设您使用的是SQL Server 2016或更高版本,您可以尝试将列表转换为类似表格的结构,并对表格执行左连接和计数。
例如:

CREATE TABLE MyTable (
  ID INT CONSTRAINT PK_MyTable PRIMARY KEY,
  Content NVARCHAR(MAX)
  );

INSERT INTO MyTable (ID,CONTENT) VALUES
  (1,'Hello, this is the test content'),
  (2,'Hi, test content.');


DECLARE @MyList NVARCHAR(MAX)

SET @MyList='["Hello","Hi","Yes","content"]';

SELECT 
  List.Value,
  COUNT(MyTable.Content) Count 
FROM OPENJSON(@MyList) List --Convert the list to a json
LEFT JOIN MyTable ON '.' + UPPER(MyTable.Content) + '.' LIKE '%[^a-z]' + UPPER(List.Value) +'[^a-z]%'
GROUP BY List.Value;

你可以在这个fiddle上试试。
请注意,还有改进的余地,比如用全文索引代替这个难看的正则表达式子句。
另请参阅:Search for “whole word match” with SQL Server LIKE pattern

相关问题