指定应与T-SQL中的LIKE REGEX匹配的字符数

h5qlskok  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(92)

我已经在谷歌上搜索了很多次,但没有找到答案。或者,至少,没有找到我希望找到的答案。我正在尝试将一个REGEXP_SUBSTR搜索从Teradata转换为SQL Server 2016上的T-SQL。
这是Teradata中的编写方式:

REGEXP_SUBSTR(cn.CONTRACT_PD_AOR,'\b([a-zA-Z]{2})-([[:digit:]]{2})-([[:digit:]]{3})(-([a-zA-Z]{2}))?\b')

花括号中的数字指定了可以匹配特定REGEXP的字符数。因此,这将查找如下格式的合同号:一九九九年九月二十九日
这在T-SQL中是不可能的吗?指定要查看的字符数?所以我必须编写如下代码:

where CONTRACT_PD_AOR like '[a-zA-Z][a-zA-Z]-[0-9][0-9]-[0-9][0-9][0-9]-[a-zA-Z][a-zA-Z]%'

难道没有更简单的方法去做这件事吗?

w1e3prcc

w1e3prcc1#

虽然不是一个答案,但使用这个方法可以使事情变得不那么单调。如果您在代码中多次需要它,这是一种设置格式并重用它的方法,同时保持它的清晰和可读性。
在顶部设置一个格式变量,然后进行必要的替换来构建它。然后在代码中使用格式名称。这样可以节省一些输入,使代码不那么模糊,并且如果在多个查询中需要该格式变量,则可以重用该格式变量,而无需进行所有输入。

Declare @fmt_CONTRACT_PD_AOR nvarchar(max) = 'XX-99-999-XX';
Set @fmt_CONTRACT_PD_AOR = REPLACE(@fmt_CONTRACT_PD_AOR, '9', '[0-9]');
Set @fmt_CONTRACT_PD_AOR = REPLACE(@fmt_CONTRACT_PD_AOR, 'X', '[a-zA-Z]');

with tbl(str) as (
select 'AA-23-234-ZZ' union all
select 'db-32-123-dd' union all
select 'ab-123-88-kk'
)
select str from tbl
where str like @fmt_CONTRACT_PD_AOR;

相关问题