SQL Server:选择在 VARCHAR(MAX) 列中具有任何 HTML 实体的记录

问题描述 投票:0回答:3

我有一个表

MyTable(id INT, stringText varchar(max))
,其中包含超过 200 万条记录。 我想编写一个查询来分析文本中具有以下任何字符(HTML 实体)的行数。

 
 

fi
fl
’
 
–
—
’
“
•
€
‚
ƒ
„
…
†
‡
ˆ
‰
Š
‹
Œ
Ž
‘
’
“
”
•
–
—
˜
™
š
›
œ
ž
Ÿ
¡
¢
£
¤
¥
¦
§
¨
©
ª
«
¬
®
¯
°
±
²
³
´
µ
¶
·
¸
¹
º
»
¼
½
¾
¿
À
Á
Â
Ã
Ä
Å
Æ
Ç
È
É
Ê
Ë
Ì
Í
Î
Ï
Ð
Ñ
Ò
Ó
Ô
Õ
Ö
×
Ø
Ù
Ú
Û
Ü
Ý
Þ
ß
à
á
â
ã
ä
å
æ
ç
è
é
ê
ë
ì

有人可以帮我写一个高效的

WHERE CLAUSE
来找出行数吗?

我尝试了类似下面的方法,但它没有给我预期的结果。

DECLARE @testStr AS VARCHAR(MAX) = 'testing - quote chars and others '+ '"' + ' '+ ' ' + '' + '- testing'
DECLARE @temp TABLE (string VARCHAR(MAX));
INSERT INTO @temp(string) VALUES ('testing - plain text'), (@testStr), ('testing' + CHAR(1) + CHAR(2) + CHAR(3) + CHAR(4)+ ' testing 1-4'), ('sathish' + CHAR(1) + ' testing - char 1'), ('sathish' + CHAR(3) + CHAR(4)+ ' testing - char 3-4')

SELECT * FROM @temp WHERE string LIKE '%[' + CHAR(1) + CHAR(2) + CHAR(3) + CHAR(4) + ']%' /* this where clause works fine, i.e. only returns the rows with any of those characters*/
SELECT * FROM @temp WHERE string LIKE '%[' + '"' + ' ' + ' ' + '' + ']%' /* this where clause doesn't work as expected, it is returning all rows*/

我假设第二个

WHERE CLAUSE
查询中的
SQL
不起作用,因为单引号中包含多个字符(这使其成为字符串而不是字符)。

提前谢谢您。

注意: 1. 数据已经在数据库中(请不要问为什么在保存到数据库之前没有处理),不幸的是我无法使用 SQL CLR 函数。

  1. 我想避免使用多个 OR 子句,如下所示:
SELECT * FROM @temp 
WHERE string LIKE '%"' 
OR string LIKE '% %' 
OR string LIKE '% %' 
OR string LIKE '5%' -- and so on
sql sql-server sql-server-2012
3个回答
2
投票

您可以尝试将所有实体作为 WHERE 子句的 IN 部分中的字符串元素

SELECT COUNT(*) FROM @temp
WHERE SUBSTRING(
   string, 
   PATINDEX('%&%',string),
   PATINDEX('%;%',string) - PATINDEX('%&%',string) + 1
) IN ('É', 'Ê', 'Ë', 'Ì', 'Í',
 '...', '...' ,a.s.o)

或使用特殊的实体表,在其中插入所有实体。那么你的IN部分看起来像这样

IN (SELECT entities FROM entities-table)

由于我没有办法测试,我只能提出一个可能的改进,以便找到';'是在找到的'&'后面

SELECT COUNT(*) FROM @temp
WHERE SUBSTRING(
   string, 
   PATINDEX('%&%',string),
   PATINDEX('%;%',  SUBSTRING(string, PATINDEX('%&%',string), max ) - PATINDEX('%&%',string) + 1
) IN ('É', 'Ê', 'Ë', 'Ì', 'Í',

0
投票

您需要做的是在

OR
子句中使用
WHERE
,如下所示:

SELECT * FROM @temp 
WHERE string LIKE '%"%' 
OR string LIKE '% %' 
OR string LIKE '% %' -- etc.

0
投票

尝试在 WHERE 子句中使用 OR 和 N'...' 作为 HTML 实体,如下所示:

SELECT * FROM @temp 
WHERE string LIKE N'%☑%' 
OR string LIKE N'%🎃%' 
OR string LIKE N'%🍰%'
© www.soinside.com 2019 - 2024. All rights reserved.