Oracle统计之like,or关键字
有的时候我们统计需要like多个条件,比如某个字段中含有 “银行”或者“投资公司”,这个时候就用like多个字段。
如下是统计某个地区的2015年入院的病种诊断中带有 “癌”或者“肿瘤”的情况,
正确的写法如:
1 SELECT B.AAC002 身份证号, 2 B.AAC003 姓名, 3 TEMP_FUNC_WYL('AAC004', B.AAC004) 性别, 4 C.AAB004 单位, 5 C.AAB999 单位编号, 6 D.AAE006 地址, 7 D.AAE005 联系电话, 8 SUBSTR(A.CKC537, 1, 8) 入院时间, 9 SUBSTR(A.CKC538, 1, 8) 出院时间, 10 A.CKC546 出院诊断, 11 A.CKB519 就诊医院 12 FROM KC21 A, AC01 B, AE01 C, SAC02 D 13 WHERE A.AAC001 = B.AAC001 14 AND B.AAC001 = D.AAC001 15 AND B.AAB001 = C.AAB001 16 AND B.BAE001 = '511502' 17 AND SUBSTR(A.CKC537, 1, 4) = 2015 18 AND A.CKC546 LIKE '%癌%' 19 GROUP BY B.AAC002, 20 B.AAC003, 21 B.AAC004, 22 C.AAB004, 23 C.AAB999, 24 D.AAE006, 25 D.AAE005, 26 A.CKC537, 27 A.CKC538, 28 A.CKC546, 29 A.CKB519 30 UNION ALL 31 SELECT B.AAC002 身份证号, 32 B.AAC003 姓名, 33 TEMP_FUNC_WYL('AAC004', B.AAC004) 性别, 34 C.AAB004 单位, 35 C.AAB999 单位编号, 36 D.AAE006 地址, 37 D.AAE005 联系电话, 38 SUBSTR(A.CKC537, 1, 8) 入院时间, 39 SUBSTR(A.CKC538, 1, 8) 出院时间, 40 A.CKC546 出院诊断, 41 A.CKB519 就诊医院 42 FROM KC21 A, AC01 B, AE01 C, SAC02 D 43 WHERE A.AAC001 = B.AAC001 44 AND B.AAC001 = D.AAC001 45 AND B.AAB001 = C.AAB001 46 AND B.BAE001 = '511502' 47 AND SUBSTR(A.CKC537, 1, 4) = 2015 48 AND A.CKC546 LIKE '%肿瘤%' 49 GROUP BY B.AAC002, 50 B.AAC003, 51 B.AAC004, 52 C.AAB004, 53 C.AAB999, 54 D.AAE006, 55 D.AAE005, 56 A.CKC537, 57 A.CKC538, 58 A.CKC546, 59 A.CKB519;
错误的写法:
1 SELECT B.AAC002 身份证号, 2 B.AAC003 姓名, 3 TEMP_FUNC_WYL('AAC004', B.AAC004) 性别, 4 C.AAB004 单位, 5 C.AAB999 单位编号, 6 D.AAE006 地址, 7 D.AAE005 联系电话, 8 SUBSTR(A.CKC537, 1, 8) 入院时间, 9 SUBSTR(A.CKC538, 1, 8) 出院时间, 10 A.CKC546 出院诊断, 11 A.CKB519 就诊医院 12 FROM KC21 A, AC01 B, AE01 C, SAC02 D 13 WHERE A.AAC001 = B.AAC001 14 AND B.AAC001 = D.AAC001 15 AND B.AAB001 = C.AAB001 16 AND B.BAE001 = '511502' 17 AND SUBSTR(A.CKC537, 1, 4) = 2015 18 AND A.CKC546 LIKE '%癌%' or LIKE '%肿瘤%' 19 GROUP BY B.AAC002, 20 B.AAC003, 21 B.AAC004, 22 C.AAB004, 23 C.AAB999, 24 D.AAE006, 25 D.AAE005, 26 A.CKC537, 27 A.CKC538, 28 A.CKC546, 29 A.CKB519
如果用这种写法,就会得到意想不到的结果。第二条统计语句的统计结果里肯定不仅仅包含2015年的情况,因为关键词 "or" 的前后是两个条件,Oracle把or前后两段当作两个完全独立的筛选条件了,or前面的是按照统计条件来统计的,而 or 后面的则 只是筛选了病种里带有“肿瘤”字样的情况。