Databricks SQL如何筛选含非法特殊字符的数据行?
解决Databricks中筛选含非法特殊字符行的问题
问题背景
需要从Table1的Col1列里筛选出仅含非法特殊字符的最后一行,但原SQL正则表达式未生效,仅排除了第一行,无法准确定位目标数据。
原正则的问题
- 连字符被误解析为范围:原正则里的
-&@并非单独匹配-、&、@三个字符,而是被解析为ASCII码中从-到&的字符范围,这会包含大量非预期字符,导致匹配逻辑混乱。 - 遗漏合法字符:第五行中的
*属于合法内容,但原正则未将其纳入允许列表,会误判该行非法;同时单引号的转义在正则中冗余(但SQL字符串内必须用双单引号转义,这点本身没问题)。
修正后的解决方案
方案1:调整正则表达式逻辑
将连字符移到字符集的开头或结尾(避免被解析为范围),补充*到合法字符列表中:
SELECT * FROM Table1 WHERE Col1 REGEXP '[^a-zA-Z0-9 &@.,/()#''``:$""*\-]'
或者更直观的写法(把-放在字符集末尾):
SELECT * FROM Table1 WHERE Col1 REGEXP '[^a-zA-Z0-9&@.,/()#''``:$""* -]'
关键说明
- 连字符在字符集首尾时,会被识别为普通字符,而非范围分隔符。
- 加入
*后,第五行的星号不会被判定为非法。 - 该正则会匹配所有不在合法字符列表内的内容,精准命中最后一行的
�乱码字符。
方案2:直接匹配已知非法字符
如果已经明确非法字符是�,用LIKE匹配更直接高效:
SELECT * FROM Table1 WHERE Col1 LIKE '%�%'
内容的提问来源于stack exchange,提问作者Nanda
相关产品推荐
相关产品推荐

