【问题标题】:Square brackets functioning in expression as expected方括号按预期发挥作用
【发布时间】:2016-01-07 11:04:03
【问题描述】:

我正在寻找包含此字符串[management]的字符串

这是一个场景模型:

create table #test (st varchar(200))
insert into #test
values 
('hello'),
('hello management'),
('hello [management]'),
('hello [management] blah'),
('hello [management rev] blah');

select * from #test where st like '%\[management]%' ESCAPE '\'

上面找到了我所期望的,但为什么下面没有找到相同的字符串?

select * from #test where st like '%[[]management[]]%'

【问题讨论】:

    标签: sql sql-server sql-like


    【解决方案1】:

    你应该只像这样转义开始括号:

    DECLARE @t table(x varchar(100))
    INSERT @t 
    SELECT '[management]'
    
    SELECT * from @t where x like '%[[]management]%'
    

    编辑:

    一旦你输入 '[]]',like 期望找到一个不匹配的字符。 '[xy]]' 将要求一个字符列表('x' 或 'y')位于该位置,'[]]' 将导致一个空字符列表位于该位置,从而使匹配不可能.

    【讨论】:

    • 谢谢 - 你有给我的参考资料,这样我就可以了解发生了什么 - 这真的违反直觉!
    • (希望你不介意 - 你先得到答案,但他需要要点并给出了很好的解释)
    【解决方案2】:

    好问题!直觉上感觉 %[[]text[]]% 应该解析为:

    任何东西[文本]任何东西。

    但事实并非如此。因为 ] 与 [ 不同,它不会启动模式搜索,因此不需要转义。请改用 %[[]text]%。

    有关详细信息,请参阅MSDN Like 页面上的“将通配符用作文字”部分。

    【讨论】:

    • 好的 - 谢谢 - 但即使 ] 没有开始模式搜索(所以已经是文字了?)在它周围加上方括号有什么害处?!这个正则表达式 'hello' 不等于 'hel[l]o' 吗?
    • 我真的很想添加一个聪明的段落来回答这个问题,但尽管我尽了最大的努力,我还是无法弄清楚。我的问题不是我不确定 [] 本身的含义。 LIKE '%[]%' 不匹配任何内容(来自您的示例记录或空字符串)。我怀疑 []] 会解析为 [] 并附加一个 ]。 [] 部分阻止任何匹配。
    • 我认为@t-clausen.dk 的答案解决了这个问题。他说 [] 要求 SQL 不匹配任何内容,这当然是做不到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2011-12-24
    • 1970-01-01
    • 2020-06-30
    • 2014-06-10
    • 2013-02-28
    • 1970-01-01
    相关资源
    最近更新 更多