sql这块空还简单点,Java那边涉及的太多了,等整理好后发表。
mysql 空值(null)和空字符(’ ')的区别,
这是我之前博客总结的,你的先有这些概念。作为初学者你最起码的掌握,null数据及字符串空数据的查询语法,以及计算中null的处理。
如果想再深入了解一点,就耐心看,东西虽杂乱无章,有些细节就在其中,避免今后踩坑。
sql这块关于null的处理案例:
这只是冰山一角,更多还得自己领悟,看的多了就见怪不怪,慢慢就掌握了。
案例1:
mysql参数是否为空_数据库中如何判断某参数为空就不执行where条件
在存储过程中使用判断一个参数:
Select a.* from trn_res_courseware a
where 1 = 1 and
IF (vtitle is NULL, 0 = 0, a.title like CONCAT('%'+vtitle+'%'));
-- vtitle 是参数。如果参数为空,则不执行(0=0永远成立),
-- 不为空,则执行 a.title like CONCAT('%'+vtitle+'%')) 查询条件。
如果你在java中通过XML 那就if标签来控制 ,纯sql就得上面那么写,防止字段空报错。
案例2:
结论:
null数据用 is null 、is not null 来筛
字符串空数据用 = 、<> 来筛 必要时结合trim去空格使用
实践出真知,还是写个小案例自己玩玩
查询空字符串
这块你的注意 ''
叫空串,其余如' '
这个可不是空串,只要中间有空格都不是,所以的确定业务要不要过滤含空格的空串
show create table test ;
CREATE TABLE `test` (
`id` int NOT NULL,
`name` varchar(20) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
`no` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
INSERT INTO test ( `id`,`name` ,`address`, `no`)
VALUES(1,'小明','北京','1'),
(2,'',' ',' '),
(3,NULL,NULL,' ');
select * from test;
# 查询 空对象(NULL) 记录
select * from test where `name` is null; -- 查出id为3的数据
select * from test where `name` is not null; -- 查出id为1、2的数据
select * from test where `name` = ''; -- 查出id为2的数据
select * from test where `address` = ''; -- 查不到数据(重点来了,它不是空串,因为有空格,虽然没数据,但实际上是个空格数据)
select * from test where trim(`address`) = ''; -- 查出id为2的数据
select * from test where `no` = ' '; -- 查出id为2、3的数据
好玩点来了,但是依旧很简单
查询空字符串、空对象的记录(使用ifnull()函数)或者 or
查询不是空字符串、不是空对象的记录(使用ifnull()函数) 或者 or
# 查询空字符串、空对象的记录(使用ifnull()函数)
select * from test where ifnull(`no` , '') = ''; -- 查不出来
select * from test where ifnull(trim(`no`) , '') = ''; -- 查出id为2、3的数据
select * from test where ifnull(`address` , '') = ''; -- 查出id为3的数据
select * from test where ifnull(trim(`address`) , '') = ''; -- 查出id为2、3的数据
#当然了你用or也无可厚非
select * from test where `no`=''or `no` is null ; -- 查不出来
select * from test where trim(`no`)=''or trim(`no`) is null ; -- 查出id为2、3的数据
#查询不是空字符串、不是空对象的记录(使用ifnull()函数)
select * from test where ifnull(`no` , '') != ''; -- 查出id为1、2、3的数据
select * from test where ifnull(trim(`no`) , '') != ''; -- 查出id为1的数据
select * from test where ifnull(`address` , '') <> ''; -- 查出id为1、2的数据
select * from test where ifnull(trim(`address`) , '') <> ''; -- 查出id为1的数据
案例3:
WHERE 当一个字段不为NULL的时候使用另一个字段判断
(大白话,同一个字段 不为空走什么条件,为空时走什么条件)
AND (
(tmp.delivery_time IS NULL AND bod.taking_date >= #{vo.takingStart})
OR
(tmp.delivery_time IS NOT NULL AND tmp.delivery_time >= #{vo.takingStart})
)
案例4:
一个字段多个数据为null的情况下,按照另外一个字段排序
方法一:将null强制放在最前:
if(isnull(字段名),0,1) asc //asc可以省略
2.将null强制放在最后
if(isnull(字段名),0,1) dsc
if(isnull(字段名),1,0) asc //asc可以省略
如果多个数为null,我们又怎样排序多个null值的数据呢?
如果index_order为空后,先按照字段从小到大排序,为空后按照id大小排序
如果单个字段,按照里面的内容排序,如果false值多个的话,按照id排序,例如
# is_true 有多个值 按照指定值排序
SELECT * WHERE status= 1 ORDER BY
FIELD(is_true,'false','true'),id asc;
SELECT * WHERE status= 1 ORDER BY
FIELD(ifnull(is_true,'other'),'false','true','other'),id asc;
案例五:
我要对null或’'赋值
# 这个只会把null的赋值
select ifnull(trim(`address`) , '333') from test ;
# 空串跟null 都可以赋值
select if(trim(`address`)= '' or trim(`address`)is null , '333',address) from test ;
# case when 就是 if的多种形式 if好比java的三元表达式,case when 则好比 java的swich
select case when trim(`address`) = '' then '333'
when trim(`address`)is null then '333' ELSE address end
from test;
案例五:
判断表字段是否为空_mysql 判断 字段是否为空。isnull函数
同时剔除null 和 空字符串 下面几个方法都一样
isnull(
address) = 0 等价于
address is not null
select LENGTH(trim(`address`)) from test; -- 空串为0
select LENGTH(null) -- 空
-- 同时剔除null 和 空字符串 下面几个方法都一样
select * from test where trim(`address`) != '' and `address` is not null
# 用isnull判断是否为空:只有exp 为null 的时候 ISNULL(exp) 函数的返回值为1 ,空串和有数据都为0;
select * from test where trim(`address`) != '' and isnull(`address`) = 0
select * from test where length(trim(`address`) ) >0 and isnull(`address`) = 0
select * from test where 1 = 1
<![CDATA[ and (name is null or LENGTH(trim(name)) < 1 ) ]]>
补充知识: <=>安全等于
is null pk <=>
IS NULL:仅仅可以判断NULL值,可读性较高
<=>:既可以判断NULL值,又可以判断普通的数值,可读性较低
select null<=>null; -- 1
select null=null; -- 空
select 1 = null; -- 空
select 1<=>null; -- 0
Java中的NULL
合理使用声明,尽量远离声明为NULL,减少一种空指针出现的概率
java list移除null元素
list.removeAll(Collections.singleton(null));
或者使用迭代器
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
if(null == iterator.next()){
iterator.remove();
}
}
流的形式
List<String> collect = list.stream().map(e -> {
// if (e == null) {
// return null;
// }
return e;
}).filter(Objects::nonNull).collect(Collectors.toList());
//或者一步到位
List<String> collect1 = list.stream().filter(Objects::nonNull).collect(Collectors.toList());
//或者使用removeIf,必须转成可操作的list
ArrayList<String> lists = new ArrayList<>(list);
lists.removeIf(Objects::isNull);
//或者
Iterables.removeIf(lists, Predicates.isNull());