【问题标题】:T-SQL Wildcard search - namespace valuesT-SQL 通配符搜索 - 命名空间值
【发布时间】:2019-02-19 16:25:17
【问题描述】:

我需要在字符串中满足一个条件,其中包含“ns[0-9]:”,其中 [0-9] 可以是任何大于 10 的数字。

例子:

DECLARE @test TABLE ( value VARCHAR(20))

INSERT INTO @test VALUES
( 'ns1:'),
( 'NOT OK'),
( 'ns7:'),
( 'ns8:'),
( 'ns9:'),
( 'ns10:'), 
( 'ns11:' )


SELECT *, PATINDEX( '%ns[0-9]:%', value ) passes
FROM @test

这仅适用于 1 到 9,不适用于 10 及以上。我可以使用 [0-9][0-9] 但它只适用于 10 及以上。我也不想要数字和冒号之间的通配符。

我只希望以下格式返回带有 patindex 的 1

ns1:、ns2:、ns10:、ns11:等

我还需要一个非功能性解决方案。出于性能原因,我想使用类似功能的字符串

谢谢

【问题讨论】:

  • : 之后或ns 之前是否有任何内容?
  • 您的查询在条件的开头有 %?这会稍微改变您查询的逻辑,并取消您希望从 LIKE 运算符中获得的任何性能优势。
  • 是的,'ns1:'之前和之后都会有值

标签: sql sql-server tsql patindex


【解决方案1】:

你可以使用:

select (case when value like 'ns[0-9]%:' and
                  value not like 'ns[0-9]%[^0-9]%:'
             then 1 else 0
        end) as passes_flag

【讨论】:

  • 由于 OP 的尝试有 ':%' 我很想知道在 ':' 之后是否还有任何东西并且仍然可以通过。在这种情况下'ns99:this:interests:me'
  • 我希望使用 PATINDEX。 'ns1:' 字符串之前和之后都会有值
  • 虽然您的解决方案可以解决某些情况,但我需要实际使用 PATINDEX 函数。我有一个复杂的字符串,其中“ns1:”在一个巨大的 XML 字符串中,我需要动态判断“ns1:”部分在哪里。
  • @MichaelPearson 。 . .只能回答您实际提出的问题。如果您还有其他问题,请考虑将其作为问题提出。
猜你喜欢
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2011-07-14
  • 1970-01-01
相关资源
最近更新 更多