SQL查询奇数patient_id逻辑错误排查:结果远超预期问题求助
SQL查询结果不符问题分析与修正
你的查询返回结果远超预期,核心问题出在两个关键逻辑错误上:
1. 错误的patient_id长度判断
你用patient_id like '%___%'来匹配3位长度的patient_id,但%代表任意数量的字符(包括0个),这个表达式会匹配所有长度≥3位的patient_id,而非恰好3位。正确的匹配方式分两种情况:
- 若patient_id是字符串类型:直接用
patient_id like '___'(去掉前后的%,确保没有额外前缀/后缀字符) - 若patient_id是数值类型:先转字符串再判断长度,
length(cast(patient_id as varchar)) = 3
2. 奇数判断的不严谨性
用like匹配末尾数字的方式虽然能生效,但如果patient_id是数值类型,或存在前导零的字符串类型,可能出现意外匹配。更严谨高效的方式是用取模运算:
- MySQL/SQL Server:
patient_id % 2 = 1 - Oracle:
mod(patient_id, 2) = 1
另外,如果attending_doctor_id是数值类型,like '%2%'会触发隐式类型转换,可能导致匹配异常,建议显式转换为字符串后再匹配:cast(attending_doctor_id as varchar) like '%2%'
修正后的SQL代码
通用版本(适配多数数据库)
SELECT patient_id, attending_doctor_id, diagnosis FROM admissions WHERE -- 条件1:patient_id为奇数且attending_doctor_id是1、5或19 (mod(patient_id, 2) = 1 AND attending_doctor_id IN (1,5,19)) OR -- 条件2:attending_doctor_id包含数字2且patient_id恰好3位 (CAST(attending_doctor_id AS VARCHAR) LIKE '%2%' AND LENGTH(CAST(patient_id AS VARCHAR)) = 3);
字符串类型patient_id适配版本
SELECT patient_id, attending_doctor_id, diagnosis FROM admissions WHERE (RIGHT(patient_id,1) IN ('1','3','5','7','9') AND attending_doctor_id IN (1,5,19)) OR (CAST(attending_doctor_id AS VARCHAR) LIKE '%2%' AND patient_id LIKE '___');
内容的提问来源于stack exchange,提问作者TomFZ
相关产品推荐
相关产品推荐

