2015-01-22 2 views
0

У меня есть следующие WHERE заявления в процедуре SQL хранится, что я проверяю на таблицу, которая хранит данные в виде XML:Как искать определенную строку с помощью LIKE команды

WHERE 
(
    CAST ([content_html] AS XML).value('(/root/Physicians/specialty/a/text())[1]', 'varchar(max)') LIKE '%' + @strService + '%' 
OR 
    CAST ([content_html] AS XML).value('(/root/Physicians/specialty2/a/text())[1]', 'varchar(max)') LIKE '%' + @strService + '%' 
OR 
    CAST ([content_html] AS XML).value('(/root/Physicians/specialty3/a/text())[1]', 'varchar(max)') LIKE '%' + @strService + '%' 
OR 
    CAST ([content_html] AS XML).value('(/root/Physicians/specialty4/a/text())[1]', 'varchar(max)') LIKE '%' + @strService + '%' 
OR 
    CAST ([content_html] AS XML).value('(/root/Physicians/specialty5/a/text())[1]', 'varchar(max)') LIKE '%' + @strService + '%' 
OR 
    CAST ([content_html] AS XML).value('(/root/Physicians/specialty6/a/text())[1]', 'varchar(max)') LIKE '%' + @strService + '%' 
) 

strService отправляемый из передняя часть моего кода, за которым выполняется хранимая процедура.

Каждый из операторов OR ссылается на каждое текстовое поле в документе XML.

Например, если я посылаю @strService = Urology поиски запроса для Urology и Neurology, потому что Urology также в Neurology

Как я могу проверить, если содержание равно @strService ИЛИ, если слово существует где-то внутри содержимого с не-буквами вокруг него или если это в самом начале или в самом конце содержимого с небуктом, следующим или предшествующим соответственно.

Вот пример:

У меня есть следующие данные:

Pediatric Urology 
Urology 
Neurology 

У меня есть следующие LIKE заявление:

LIKE 'Urology' = only Urology is displayed

LIKE '% Urology = nothing is displayed

LIKE '%[^a-zA-Z]Urology' = only Pediatric Urology is displayed

Я хотел бы показать Pediatric Urology и Urology в этом случае.

До тех пор, пока слово существует с пространством перед ним, я хотел бы показать.

+1

Какие СУБД вы используете? MySQL, SQL-сервер, Oracle, PostgreSQL, ...? – Barranka

+0

@Barranka SQL Server – SearchForKnowledge

+0

'LIKE '% Урология ничего не отображает, потому что отсутствует закрывающая одинарная кавычка. Кроме того, вам нужно «ИЛИ» эти утверждения («СОДЕРЖАНИЕ« Урология »ИЛИ СОДЕРЖАНИЕ, КАК« Урология »ИЛИ СОДЕРЖАНИЕ, КАК« Урология% ») –

ответ

1

Используйте следующее выражение:

CONTENT LIKE @strService 
OR CONTENT LIKE '%[^a-zA-Z0-9]' + @strService + '[^a-zA-Z]%' 
OR CONTENT LIKE @strService + '[^a-zA-Z]%' 
OR CONTENT LIKE '%[^a-zA-Z]' + @strService 

Heres объяснение:

CONTENT LIKE @strService 

будет проверять равенство

CONTENT LIKE '%[^a-zA-Z0-9]' + @strService + '[^a-zA-Z]%' 

проверит для случая, когда слово существует где-то в пределах содержания с не-буквами вокруг него

CONTENT LIKE @strService + '[^a-zA-Z]%' 

проверит для случая, когда слово существует в самом начале содержания с не-буквой следующего

CONTENT LIKE '%[^a-zA-Z]' + @strService 

проверит для случая, когда слово существует в самом конце содержимого с предшествующий небук.

Если вы хотите исключить числа из множества возможных смежных букв, используйте [^a-zA-Z0-9] вместо [^a-zA-Z].

Надеюсь, это поможет!

+0

CONTENT LIKE @strService хорош, и как я могу добавить OR statemement, чтобы проверить, есть ли место перед урологией? Например, если я ищу урологию, урология и детская урология должны появиться. – SearchForKnowledge

+0

Регулярное выражение [^ a-zA-Z] должно содержать пробелы. –

+0

Как насчет ТОЛЬКО включать пробел? – SearchForKnowledge

0

конкатенации строки зависит от типа СУБД вы используете
Для например:

Oracle и Postgrasql использует «||»
Хотя SQL-сервер использует «+»

А использование правильного дикого характера поможет вам найти то, что вы ищете.

+0

Я использую SQL Server. – SearchForKnowledge

Смежные вопросы