MYSQL中的null与空字符及空空格,Java中的Null,字符串空,大杂烩

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 ascSELECT *  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元素

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());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值