多表多字段数据提取问题:SQL查询可运行但返回空结果求助
排查查询返回空结果的原因及解决方法
你的两个查询语句语法是正确的,但返回空结果,大概率是数据或查询条件的细节没考虑到,咱们一步步来梳理可能的问题:
1. 先确认code字段的数据类型
如果code是字符串类型(比如varchar、text),直接用数字范围查询会失效——因为数据库会把数字转成字符串来比较,而字符串的排序逻辑和数值不同。比如字符串"18789"和数值18789在数据库里是不同的类型,你需要把查询条件改成字符串形式:
select * from onshore.contracting where code between '18789' and '18798'; select * from onshore.safety_incident where code between '18789' and '18798';
想确认字段类型的话,可以执行:
DESC onshore.contracting; DESC onshore.safety_incident;
2. 验证目标范围内是否真的存在数据
有可能这两个表本身就没有code值在18789-18798之间的记录。你可以先查询表中所有code的分布情况:
-- 查看contracting表的code值 SELECT DISTINCT code FROM onshore.contracting ORDER BY code; -- 查看safety_incident表的code值 SELECT DISTINCT code FROM onshore.safety_incident ORDER BY code;
如果结果里没有你要的范围值,那说明数据本身不存在,得确认数据是否正确导入,或者是不是找错了表。
3. 检查code字段是否有隐藏字符
字符串类型的code可能会有前后空格、制表符这类隐藏字符,比如" 18789 ",这会导致范围查询匹配不到。可以用TRIM()函数处理后再查询:
select * from onshore.contracting where TRIM(code) between '18789' and '18798'; select * from onshore.safety_incident where TRIM(code) between '18789' and '18798';
4. 确认表名和库名的正确性
虽然语句能正常运行,但还是要核对onshore库名、contracting和safety_incident表名是否完全正确——有些数据库(比如PostgreSQL)对表名大小写敏感,要是表名是驼峰或大写,你用小写查询可能会指向空表。
5. 排查权限问题
极少数情况下,你可能有查询权限,但被行级权限限制看不到某些数据。可以尝试用拥有更高权限的账号执行同样的查询,看看是否能返回结果。
内容的提问来源于stack exchange,提问作者Tiff G
相关产品推荐
相关产品推荐

