You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:55:08