正则表达式 '?' 的类似物(前面的项目可选)类似于 T-SQL?

问题描述 投票:0回答:2

我想知道,是否可以翻译包含“?”的正则表达式(前面的项目可选)在 T-SQL LIKE 模式中? DB 端无需任何操作。例如,

"^31-?4"
。我可以将其分成几个子句,但如果正则表达式包含很多“?”这不太方便。

regex t-sql
2个回答
27
投票

LIKE
不使用正则表达式,并且它使用的模式语言没有标记和限定符,只有一些占位符

Wildcard character    Description
------------------    -----------
%                     Any string of zero or more characters.
_ (underscore)        Any single character.
[ ]                   Any single character within the specified range ([a-f]) or set ([abcdef]).
[^ ]                  Any single character not within the specified range ([^a-f]) or set ([^abcdef]).

所以不,你没有要求这样的东西。


0
投票

最简单的方法是使用 2 个赞,并用或替换“?”用单个字符匹配“_”或替换“?”带有空字符串 '' 因此单字符匹配是可选的。

我还提供正则表达式使用的 ^ 和 $ 开头和结尾符号。

那么,

DECLARE @Pattern VARCHAR(10) = '^31-?4'
SELECT *
FROM Table
WHERE col LIKE @Pattern

相当于:

DECLARE @Pattern VARCHAR(10) = '^31-?4'; --rather than my first cte you could just use a pattern of '31-?4%'

WITH CTETable AS (
    SELECT t.Code
    FROM (VALUES('31-142 XXX'), ('31-422 XXX'), ('31-334 XXXX')) t(Code)
), CTEPattern AS (
    SELECT IIF(p.Value LIKE '%$', SUBSTRING(p.Value, 1, LEN(p.Value) - 1), p.Value + '%') as Pattern
    FROM (SELECT IIF(@Pattern LIKE '^%', SUBSTRING(@Pattern, 2, LEN(@Pattern) - 1), '%' + @Pattern) as Value) p
)
SELECT t.*
FROM CTETable t
    CROSS JOIN CTEPattern p
WHERE Code LIKE REPLACE(p.Pattern, '?', '_') OR Code LIKE REPLACE(p.Pattern, '?', '')

如果您不搜索“?”,则此方法效果很好本身在文本中。

© www.soinside.com 2019 - 2024. All rights reserved.