SQL Server: выберите записи, содержащие какие-либо объекты HTML в столбце VARCHAR(MAX)

У меня есть таблица MyTable(id INT, stringText varchar(max)) с более чем 2 миллионами записей. Я хотел бы написать запрос для анализа количества строк, которые имеют любой из следующих символов (сущности 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

person Sathish    schedule 02.09.2015    source источник


Ответы (2)


Вы можете попробовать использовать все свои сущности в виде строковых элементов в части IN предложения WHERE CLAUSE.

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 ('É', 'Ê', 'Ë', 'Ì', 'Í',
person sqlab    schedule 02.09.2015
comment
Похоже, что-то не так с вашим скриптом SQL, не могли бы вы его исправить? - person Sathish; 02.09.2015
comment
Было бы здорово, если бы вы могли настроить свой запрос для использования с моим примером (@переменная таблицы temp), чтобы я мог расширить его по мере необходимости для моей реальной таблицы. - person Sathish; 02.09.2015
comment
Пробовал, выдает ошибку 'string' is not a recognized built-in function name. SELECT COUNT(*) FROM @temp WHERE string( string, PATINDEX('%&%',string), PATINDEX('%;%',line) - PATINDEX('%&%',line) + 1 ) IN ('É', 'Ê', 'Ë', 'Ì', 'Í') - person Sathish; 02.09.2015
comment
Извините, я перепутал вашу оригинальную и вашу промежуточную таблицу. Вы можете использовать свою настоящую таблицу, заменив @temp и string. Взгляните на исправленную версию. - person sqlab; 02.09.2015
comment
Спасибо за исправление SQL. Я попробую. - person Sathish; 02.09.2015

Что вам нужно сделать, так это использовать OR в вашем предложении WHERE, например:

SELECT * FROM @temp 
WHERE string LIKE '%"%' 
OR string LIKE '% %' 
OR string LIKE '% %' -- etc.
person rory.ap    schedule 02.09.2015
comment
Я думаю, что OP пытается сделать один LIKE для объединенной строки (т.е. все значения сразу). - person jarlh; 02.09.2015
comment
@roryap: Спасибо за ответ. Мне было бы интересно узнать, есть ли другие альтернативы. - person Sathish; 02.09.2015
comment
Нет, я думаю, это самый простой способ. Вы можете легко создать запрос с помощью расширенного текстового редактора, такого как UltraEdit или Notepad++, используя их функции поиска и замены. - person rory.ap; 02.09.2015