我有一个表
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 函数。
SELECT * FROM @temp WHERE string LIKE '%"' OR string LIKE '% %' OR string LIKE '% %' OR string LIKE '5%' -- and so on
您可以尝试将所有实体作为 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 ('É', 'Ê', 'Ë', 'Ì', 'Í',
您需要做的是在
OR
子句中使用 WHERE
,如下所示:
SELECT * FROM @temp
WHERE string LIKE '%"%'
OR string LIKE '% %'
OR string LIKE '% %' -- etc.
尝试在 WHERE 子句中使用 OR 和 N'...' 作为 HTML 实体,如下所示:
SELECT * FROM @temp
WHERE string LIKE N'%☑%'
OR string LIKE N'%🎃%'
OR string LIKE N'%🍰%'