我的SQL查询:
SELECT
[content_id] AS [LinkID]
, dbo.usp_ClearHTMLTags(CONVERT(nvarchar(600), CAST([content_html] AS XML).query('root/Physicians/name'))) AS [Physician Name]
FROM
[DB].[dbo].[table1]
WHERE
[id] = '188'
AND
(content LIKE '%Urology%')
AND
(contentS = 'A')
ORDER BY
--[content_title]
dbo.usp_ClearHTMLTags(CONVERT(nvarchar(600), CAST([content_html] AS XML).query('root/Physicians/name')))
我遇到的问题是,如果content
为Neurology
或Urology
,则会显示在结果中。
有没有办法让它如果是 Urology ,它只会提供 Urology 结果,如果它神经病学,它只会给出神经病学结果。
它可以是泌尿科,神经内科,内科学等等......所以上面使用的两个是造成这个问题的原因。
content
是一个带有XML标记的ntext列,例如:
<root><Location><location>Office</location>
<office>Office</office>
<Address><image><img src="Rd.jpg?n=7513" /></image>
<Address1>1 Road</Address1>
<Address2></Address2>
<City>Qns</City>
<State>NY</State>
<zip>14404</zip>
<phone>324-324-2342</phone>
<fax></fax>
<general></general>
<from_north></from_north>
<from_south></from_south>
<from_west></from_west>
<from_east></from_east>
<from_connecticut></from_connecticut>
<public_trans></public_trans>
</Address>
</Location>
</root>
通过更新,此content
列具有以下XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<Physicians>
<name>Doctor #1</name>
<picture>
<img src="phys_lab coat_gradation2.jpg?n=7529" />
</picture>
<gender>M</gender>
<langF1>
<a href="/ult.aspx" title="English">English</a>
</langF1>
<specialty>
<a title="Neurology" href="neu.aspx">Neurology</a>
</specialty>
</Physicians>
</root>
如果我搜索Lab
,则会显示结果,因为列中有文字lab
。
答案 0 :(得分:2)
如果您不使用CLR proc来使用Regexes(SQL Server本身没有正则表达式功能),我会这样做。
SELECT
[...]
WHERE
(content LIKE @strService OR
content LIKE '%[^a-z]' + @strService + '[^a-z]%' OR
content LIKE @strService + '[^a-z]%' OR
content LIKE '%[^a-z]' + @strService)
通过这种方式,您可以检查内容是否等于@strService 或,如果该字词位于内容中的某个地方,并且周围有非字母或,如果它是&#39;在内容的开头或结尾处,分别在后面或前面有非字母。
[^...]
表示&#34;不属于这些&#34; 的字符。如果在搜索查询之前或之后您不想接受其他字符,请将它们放在每个方括号中的4个( ^
之后!)。例如[^a-zA-Z_]
。
答案 1 :(得分:1)
众所周知,数据库在语义上是不好的(即他们不理解神经学或泌尿学的概念 - 一切都只是一串字符)。
最好的解决方案是创建一个定义术语的表(两列,PK和术语名称)。
然后查询是一个连接:
join table1.term_id = terms.term_id and terms.term = 'Urology'
这样,您可以避开LIKE
并搜索特定结果。
如果你不能这样做,那么SQL可能是错误的工具。使用LIKE
获取一组匹配的结果,然后使用命令式编程语言清除那些不需要的结果。
答案 2 :(得分:1)
在我看来,你的选择是:
Aaron的建议很好 IF 您可以预先了解可用于搜索的所有条款。我能看到的问题是,如果有人搜索特定的单词组合。
答案 3 :(得分:0)
根据您的内容判断,您是否可以利用您正在搜索的字符串中有引号这一事实?
选择 [...] 哪里 (内容喜欢'%'“泌尿科”“%')