MySQL中REGEXP_LIKE匹配多子串报错(1210)的解决方法咨询
问题解决:REGEXP_LIKE参数错误及SQL修正
错误原因分析
- REGEXP_LIKE参数使用错误:MySQL中
REGEXP_LIKE的语法为REGEXP_LIKE(expr, pattern[, match_type]),你错误地传入了三个参数(列名+两个正则表达式),这不符合函数的参数要求,导致报错Incorrect arguments to regexp_like。 - 正则表达式写法错误:
^TL,的写法不符合需求,^表示匹配字符串开头,这里不需要强制用逗号分隔,且你的需求是字符串同时包含TL和指定子串,而非开头匹配两个独立模式。 - CREATE TABLE语法不完整:你缺少从原表获取
Unit_No数据的逻辑,直接在列定义中写计算表达式无法正确加载数据。 - 字符串常量格式问题:MySQL中推荐用单引号包裹字符串常量,双引号在部分sql_mode配置下会被识别为表/列名,导致逻辑错误。
修正后的SQL写法
根据你的匹配规则,提供两种可行的修正方案:
方案1:用AND结合多个REGEXP_LIKE(直观易懂)
USE Schema1; CREATE TABLE table1 AS SELECT Unit_No, CASE -- 同时包含TL和A2/A3 WHEN REGEXP_LIKE(Unit_No, 'TL') AND REGEXP_LIKE(Unit_No, 'A[23]') THEN 'Type 1' -- 同时包含TL和VG WHEN REGEXP_LIKE(Unit_No, 'TL') AND REGEXP_LIKE(Unit_No, 'VG') THEN 'Type 2' -- 同时包含TL和VF WHEN REGEXP_LIKE(Unit_No, 'TL') AND REGEXP_LIKE(Unit_No, 'VF') THEN 'Type 3' ELSE NULL END AS Unit_Type FROM 你的原表名称; -- 替换为实际存储Unit_No列的表名
方案2:用单个复合正则表达式(更简洁)
结合你的数据格式(TL03-XXX),可以用正则确保字符串以TL开头,同时包含目标子串:
USE Schema1; CREATE TABLE table1 AS SELECT Unit_No, CASE -- 以TL开头且包含A2/A3 WHEN REGEXP_LIKE(Unit_No, '^TL.*A[23]') THEN 'Type 1' -- 以TL开头且包含VG WHEN REGEXP_LIKE(Unit_No, '^TL.*VG') THEN 'Type 2' -- 以TL开头且包含VF WHEN REGEXP_LIKE(Unit_No, '^TL.*VF') THEN 'Type 3' ELSE NULL END AS Unit_Type FROM 你的原表名称; -- 替换为实际存储Unit_No列的表名
关键修正点说明
- 合并A2/A3的匹配逻辑:用
A[23]正则可以同时匹配A2和A3,避免重复写两个WHEN条件。 - 修正函数参数:每个
REGEXP_LIKE只传入列名和一个正则表达式,或用AND连接多个REGEXP_LIKE实现多条件匹配。 - 补全表创建逻辑:通过
CREATE TABLE ... AS SELECT从原表读取数据并计算生成新表,确保数据能正确加载。
内容的提问来源于stack exchange,提问作者Basel Ahmed
相关产品推荐
相关产品推荐

