首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使类似在SQL中查找特定的字符串,而不仅仅是通配符

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

Stack Overflow用户
提问于 2014-12-19 13:43:18
回答 4查看 104关注 0票数 0

我的SQL查询:

代码语言:javascript
复制
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,它就会出现在结果中。

如果它是泌尿外科,它只会给出泌尿外科结果,如果是神经学,它只会给神经学结果。

它可以是泌尿外科、神经学、内科等。因此,上述两种情况都是导致这一问题的原因。

content是一个包含XML标记的ntext列,例如:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
<?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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-19 14:00:18

如果您不想让CLR使用Regexes ( Server没有本地的regex功能),我就会这样做。

代码语言:javascript
复制
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_]

票数 2
EN

Stack Overflow用户

发布于 2014-12-19 13:50:47

数据库在语义上是出了名的糟糕(也就是说,他们不理解神经学或泌尿外科的概念--所有的东西都只是一串字符)。

最好的解决方案是创建一个定义术语(两列、PK和术语名称)的表。

然后,查询是一个连接:

代码语言:javascript
复制
join table1.term_id = terms.term_id and terms.term = 'Urology'

这样,您可以避免使用LIKE并搜索特定的结果。

如果您不能这样做,那么SQL可能是错误的工具。使用LIKE获得一组匹配的结果,然后在命令式编程语言中,从不需要的结果中清除这些结果。

票数 1
EN

Stack Overflow用户

发布于 2014-12-19 13:58:11

在我看来,你的选择是:

  1. 创建一个函数,该函数处理一个字符串并在其中找到一个完整的匹配。
  2. 创建一个CLR扩展,允许您调用.NET代码并利用.NET的REGEX功能

是一个很好的建议,如果,您可以预先知道所有用于搜索的术语。我可以看到的问题是,如果有人搜索一个特定的词组合。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27567361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档