表名: t_mailother53
需查询的数据如下
INFO4 | INFO10 |
---|---|
(NULL) | (NULL) |
1 1 | 06 |
1111 | 07 |
如果不进行判断直接执行一下语句:
SELECT INFO4
FROM t_mailother53 WHERE MAILID = '10' AND INFO10 = '05'
UNION ALL
SELECT INFO4
FROM t_mailother53 WHERE MAILID = '10' AND INFO10 = '06'
UNION ALL
SELECT INFO4
FROM t_mailother53 WHERE MAILID = '10' AND INFO10 = '07';
查询结果为:
INFO4 |
---|
1 1 |
1111 |
在取值时,因UNION 以及 UNION ALL对无记录的数据无效,所以取值的时候,会将所有数据前移去填补空缺的数据,例如
原本应是:
a[0] = null,a[1]=a[1],a[2]=a[2];
现在变成了:
a[0] = a[1],a[1]=a[2],a[2]=null;
取值顺序错乱,导致后续操作全错,这就需要添加IF判断,
可以先用COUNT()函数获取记录条数:COUNT(INFO4),
再通过IF判断,当COUNT(INFO4)为0时,即无INFO10='05’的记录时,为查询结果赋值NULL,
结合完善后SQL语句如下:
SELECT IF(COUNT(INFO4)=0,NULL,INFO4) INFO4
FROM t_mailother53 WHERE MAILID = '10' AND INFO10 = '05'
UNION ALL
SELECT IF(COUNT(INFO4)=0,NULL,INFO4) INFO4
FROM t_mailother53 WHERE MAILID = '10' AND INFO10 = '06'
UNION ALL
SELECT IF(COUNT(INFO4)=0,NULL,INFO4) INFO4
FROM t_mailother53 WHERE MAILID = '10' AND INFO10 = '07';
查询结果为:
INFO4 |
---|
(NULL) |
1 1 |
1111 |
这样取值时就不会担心数据错位。
注:
使用UNION 查询到相同数据时,只会显示一条数据,所以此处用UNION ALL,详情请参考:https://www.w3school.com.cn/sql/sql_union.asp
在进行多表查询时,要确保不同表中需查询的字段名和字段类型一致,每次查询语句查询的字段数一致,即SELECT后的字段名一致,请勿出现一下请况:
SELECT INFO3
FROM t_mailother51 WHERE MAILID = '10' AND INFO10 = '05'
UNION ALL
SELECT INFO4,INFO5
FROM t_mailother52 WHERE MAILID = '10' AND INFO10 = '06'
UNION ALL
SELECT INFO4
FROM t_mailother53 WHERE MAILID = '10' AND INFO10 = '07';