我的表中有一个名为 MAT_DESC 的列,其中包含自由文本格式的材料描述。以下是 MAT_DESC 列中的一些示例值:
RTYU 31655, 240+, 6 in, 50 Discs/Roll, 6 Rolls/Case
QWERTYUI PN-DR, Coarse, TR, 1-1/2 in, 50/Carton, 200 ea/Case, Dispenser Pack
2841 PC GREY AS/AF (20/CASE)
CI-1A, up to 35 kV, Compact/Solid, Stranded, 10/Case
MT53H7A4410WS5 WS WEREDSS PMR45678 ERTYUI HEERTYUIND 10/case
TYPE.2 86421-K40-F000, 1 Set/Pack, 100 Packs/Case
Clear, 1 in x 36 yd, 4.8 mil, 24 rolls per case
我正在尝试从 MAT_DESC 列中提取子字符串的特定模式,例如数量和单位信息(例如“50 光盘/卷”、“200 ea/箱”、“10/箱”、50/箱) 200 件/箱等)。 我目前正在使用以下 SQL 查询来尝试此操作:
SELECT MAT_DESC,
CASE
WHEN PATINDEX('%[A-Za-z]/[A-Za-z]%', MAT_DESC) > 0
THEN CAST(PATINDEX('%[A-Za-z]/[A-Za-z]%', MAT_DESC) AS VARCHAR)
ELSE 'No X'
END AS Unit_Index
FROM TEMP_TABLE;
此查询使用 PATINDEX 函数查找“Discs/Roll”或“ea/Case”等子字符串的模式索引。然后,我计划在模式索引之前和之后找到最近的逗号索引,并使用这些索引提取子字符串。 然而,这种方法适用于某些场景,但在其他场景中却失败,特别是当材料描述包含附加信息或结构不同时。
是否有更可靠的方法从自由文本材料描述列中提取特定的子字符串模式(例如数量和单位信息)?也许使用正则表达式或其他字符串操作技术?我对 SQL 解决方案持开放态度
这是一项痛苦的练习。
我的建议:
1 尝试将数据解析为有用的块,例如
SELECT *
FROM TEMP_TABLE
CROSS APPLY STRING_SPLIT( MAT_DESC, ',' ) AS Chunks( chunk )
2 识别有用的部分,例如
SELECT *
FROM TEMP_TABLE
CROSS APPLY STRING_SPLIT( MAT_DESC, ',' ) AS Chunks( chunk )
WHERE chunk LIKE '%Discs/Roll%' OR chunk LIKE '%ea/Case%' OR etc .....
您必须指定要保留的字符串“白名单”。
您可以尝试应用您的
PATINDEX
查询 (PATINDEX('%[A-Za-z]/[A-Za-z]%', chunk) > 0
),但根据您的数据,它可能会返回一些误报,您需要明确排除这些误报。