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. Бих искал да избегна множество клаузи ИЛИ нещо като по-долу:
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

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 и низ. Разгледайте преработената версия. - 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 на конкатениран низ (т.е. .all стойности наведнъж.) - person jarlh; 02.09.2015
comment
@roryap: Благодаря ви за отговора. Ще ми е интересно да знам дали има други алтернативи. - person Sathish; 02.09.2015
comment
Не, мисля, че това е може би най-лесният начин. Можете да създадете заявката достатъчно лесно с усъвършенстван текстов редактор като UltraEdit или Notepad++, използвайки техните функции за намиране и замяна. - person rory.ap; 02.09.2015