我的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,它就会出现在结果中。
如果它是泌尿外科,它只会给出泌尿外科结果,如果是神经学,它只会给神经学结果。
它可以是泌尿外科、神经学、内科等。因此,上述两种情况都是导致这一问题的原因。
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。
发布于 2014-12-19 14:00:18
如果您不想让CLR使用Regexes ( Server没有本地的regex功能),我就会这样做。
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 或,如果该单词存在于内容中的某个地方,其周围是非字母,则为或,如果该词位于内容的最开始或最末尾,则其后面或前面各有一个非字母。
[^...]的意思是“一个没有这些的字符”。如果在搜索查询之前或之后还有其他字符不愿接受,请将它们放在方括号中的每4个中(在^**!**).之后的)。例如,[^a-zA-Z_]。
发布于 2014-12-19 13:50:47
数据库在语义上是出了名的糟糕(也就是说,他们不理解神经学或泌尿外科的概念--所有的东西都只是一串字符)。
最好的解决方案是创建一个定义术语(两列、PK和术语名称)的表。
然后,查询是一个连接:
join table1.term_id = terms.term_id and terms.term = 'Urology'这样,您可以避免使用LIKE并搜索特定的结果。
如果您不能这样做,那么SQL可能是错误的工具。使用LIKE获得一组匹配的结果,然后在命令式编程语言中,从不需要的结果中清除这些结果。
发布于 2014-12-19 13:58:11
在我看来,你的选择是:
是一个很好的建议,如果,您可以预先知道所有用于搜索的术语。我可以看到的问题是,如果有人搜索一个特定的词组合。
https://stackoverflow.com/questions/27567361
复制相似问题