我正在SQL Management Studio 2008 R2中尝试使用regex模式从表中筛选数据。
我的表"Asset"包含列"Asset_n",其中包含资产名称。目标是能够只过滤五种类型的名称:
- 仅包含五个数字字符,例如
12345
- 仅包含六个数字字符,例如
123456
- 包含五个数字字符,并以一个或两个非数字字符结尾,例如
12345a
或12345ab
- 包含六个数字字符,并以一个或两个非数字字符结尾,例如。
123456a
或123456ab
这是我的问题:
SELECT * FROM Asset WHERE asset_n LIKE [d{5,6}w{1,2}]
查询不返回任何内容。。。我在PowerShell中使用了相同的regex模式,它运行得很好。SQL对我来说是新事物,所以我真的不知道如何为SQL查询构建正则表达式模式。
提前感谢您的帮助。
SQL Server不支持LIKE参数中的regex,但是您可以使用以下查询执行您想要的操作:
SELECT * FROM Asset WHERE
asset_n LIKE '[0-9][0-9][0-9][0-9][0-9]'
OR asset_n LIKE '[0-9][0-9][0-9][0-9][0-9][0-9]'
OR asset_n like '[0-9][0-9][0-9][0-9][0-9][a-z]' OR asset_n like '[0-9][0-9][0-9][0-9][0-9][a-z][a-z]'
OR asset_n like '[0-9][0-9][0-9][0-9][0-9][0-9][a-z]' OR asset_n like '[0-9][0-9][0-9][0-9][0-9][0-9][a-z][a-z]'
试试这个:
select * from Asset
where left(asset_n, 5) not like '%[^0-9]%' and
(SUBSTRING(asset_n, 6, 4) like '[0-9][a-z][a-z]' or
SUBSTRING(asset_n, 6, 4) like '[0-9][a-z]' or
SUBSTRING(asset_n, 6, 4) like '[0-9]' or
SUBSTRING(asset_n, 6, 4) = '')
为什么是4?因为你有8个字符的最大长度,你想过滤那些长度较大的字符。