Microsoft SQL Server中如何用单条SQL匹配261/TEPU.x.x格式的所有SKU变体
解决SQL Server中匹配261/TEPU.x.x格式SKU的问题
我们有一套商品变体的SKU编码系统,通用格式为261/TEPU.x.x,其中x可替换为任意多个字符,示例变体如下:
261/TEPU.A.I261/TEPU.Z.GS
需求是从dbo.MA_Items表中筛选出所有符合该格式的变体,表中现有记录包括:
261/NOOO.A.I261/TEPU.A.I261/TEPU.Z.GS
之前的尝试问题
- 使用以下语句仅能匹配到
261/TEPU.A.I:
SELECT PERCENT Item FROM dbo.MA_Items WHERE (Item + ' ' LIKE '261/TEPU.[^*].[^*]') ORDER BY Item
- 使用另一条语句仅能匹配到
261/TEPU.Z.GS:
SELECT TOP (100) PERCENT Item, Description, IC_InventoryDivision FROM dbo.MA_Items WHERE (Item + ' ' LIKE '261/TEPU.[^*].[^*][^*]') ORDER BY Item
- 尝试正则风格的
LIKE '261/TEPU.[^*]+.[^*]+'在SQL Server中不生效,因为SQL Server的LIKE不支持+表示1次或多次匹配。
可行解决方案
方案1:使用LIKE通配符组合
通过%匹配任意长度字符,同时限定结构为261/TEPU.开头,包含两段由.分隔的内容:
SELECT Item, Description, IC_InventoryDivision FROM dbo.MA_Items WHERE Item LIKE '261/TEPU.%._%' ORDER BY Item
注:%匹配任意长度(包括0)的字符,_匹配单个任意字符,组合后确保两段x都至少有一个字符。
方案2:利用字符串函数验证结构
通过CHARINDEX定位.的位置,确保SKU符合261/TEPU. + 内容 + . + 内容的结构,且没有多余的.:
SELECT Item, Description, IC_InventoryDivision FROM dbo.MA_Items WHERE Item LIKE '261/TEPU.%' -- 确保在261/TEPU.之后存在第二个. AND CHARINDEX('.', Item, LEN('261/TEPU.') + 1) > 0 -- 确保第二个.之后没有更多的. AND CHARINDEX('.', Item, CHARINDEX('.', Item, LEN('261/TEPU.') + 1) + 1) = 0 ORDER BY Item
方案3:使用PATINDEX函数
SQL Server的PATINDEX支持有限的模式匹配,可用于验证结构:
SELECT Item, Description, IC_InventoryDivision FROM dbo.MA_Items WHERE PATINDEX('261/TEPU.[^.]%.[^.]%', Item) > 0 ORDER BY Item
解释:[^.]匹配非.字符,%匹配任意长度字符,确保261/TEPU.之后是至少一个非.字符,接着.,再是至少一个非.字符。
内容的提问来源于stack exchange,提问作者Fabio 2022
相关产品推荐
相关产品推荐

