Snowflake中LIKE查询匹配load_fname字段无返回结果问题咨询
问题成因
LIKE运算符不加通配符%时,逻辑等价于精确匹配=,你提供的路径是S3文件夹前缀,而load_fname字段存储的是完整的文件路径,后面还拼接了具体的文件名,没有通配符的情况下无法匹配前缀。- 存在大小写匹配差异:如果你的数据库配置为大小写敏感,字段中存储的路径大小写和你填写的查询内容不一致(比如存的是小写
fk/pi,你写的是大写FK/pi)也会导致匹配失败。 - 字段内容存在不可见字符:数据入库时可能带入了首尾空格、制表符、换行符等不可见空白,也会导致精确匹配失效。
- 通配符冲突:路径中的
_在LIKE语法中属于通配符,默认会匹配任意单个字符,如果路径中实际存在其他字符刚好匹配了_的通配逻辑,也会出现预期外的匹配结果。
解决方法
- 补充前缀匹配通配符
如果要匹配该路径下的所有文件,在查询路径末尾加上%即可匹配任意后续字符:
SELECT load_dt, load_fname FROM my_table WHERE load_fname LIKE 'FK/pi/2021-10-18/post_date=2021-10-12/%'
- 兼容大小写差异
如果确认是大小写敏感导致的问题,可以统一转换为小写/大写再匹配:
SELECT load_dt, load_fname FROM my_table WHERE LOWER(load_fname) LIKE LOWER('FK/pi/2021-10-18/post_date=2021-10-12/%')
- 清理不可见空白
如果是字段首尾有空白导致的问题,先用TRIM函数清理后再匹配:
SELECT load_dt, load_fname FROM my_table WHERE TRIM(load_fname) LIKE 'FK/pi/2021-10-18/post_date=2021-10-12/%'
- 避免通配符冲突
如果不想让_等特殊字符被识别为通配符,可以使用数据库自带的前缀匹配函数,比如PostgreSQL可以用starts_with:
SELECT load_dt, load_fname FROM my_table WHERE starts_with(load_fname, 'FK/pi/2021-10-18/post_date=2021-10-12/')
MySQL可以声明转义符规避通配符解析:
SELECT load_dt, load_fname FROM my_table WHERE load_fname LIKE 'FK!_pi!_2021-10-18/post!_date=2021-10-12/%' ESCAPE '!'
- 快速定位差异
你可以先取出一条符合exec_date条件的load_fname内容直接对比,就能快速找到不匹配的具体原因:
SELECT load_fname FROM my_table WHERE TO_DATE(exec_date) = '2021-10-18' LIMIT 1;
内容的提问来源于stack exchange,提问作者KristiLuna
相关产品推荐
相关产品推荐

