我有一个定义为的列NVARCHAR(512)
,我需要搜索它是否包含值 ABC 后跟 10 位数字。
因此我需要能够查找此列是否具有类似“ABC1234567890”的值。我知道我可以这样做:
WHERE Column1 LIKE '%ABC[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%'
这将找到包含 ABC + 10 位数字的列。我必须对大约 12 种不同的变体执行此操作,因此这似乎不是最有效的方法。似乎我应该能够执行类似
WHERE Column1 LIKE '%ABC\[Next Ten Digits are Numeric\]
而不是复制/粘贴[0-9]
十次。
几年后,我们应该能够使用
REGEXP_LIKE
并做一些类似的事情如果你只想匹配 0-9 或者
匹配任意Unicode 数字
但目前这只是预览功能,并且仅限于 Azure。
目前,避免复制粘贴并更容易看到重复次数的方法是
该表达式
CONCAT('%ABC',REPLICATE('[0-9]',10),'%')
最终仍会产生相同的底层模式%ABC[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%
,但是方式更加DRY。使用显式子句的原因
COLLATE
是为了避免匹配在某些其他排序规则之间和之间排序的潜在不需要的额外字符。0
9
有时,反转这种逻辑也很有用。您可以使用
TRANSLATE
将所有非零数字转换为0
,然后可能使用稍微更简单的表达式来对抗规范形式。