如何在SQL中使LIKE查找特定的字符串而不仅仅是通配符

时间:2014-12-19 13:43:18

标签: sql tsql sql-server-2012

我的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')))

我遇到的问题是,如果contentNeurologyUrology,则会显示在结果中。

有没有办法让它如果是 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

4 个答案:

答案 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)

在我看来,你的选择是:

  1. 创建一个处理字符串并在其中查找完整匹配的函数
  2. 创建一个CLR扩展,允许您调用.NET代码并利用.NET的REGEX功能
  3. Aaron的建议很好 IF 您可以预先了解可用于搜索的所有条款。我能看到的问题是,如果有人搜索特定的单词组合。

答案 3 :(得分:0)

根据您的内容判断,您是否可以利用您正在搜索的字符串中有引号这一事实?

选择 [...] 哪里 (内容喜欢'%'“泌尿科”“%')