欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Oracle-Mysql中字段数据含有空值时的like处理

程序员文章站 2024-03-16 09:14:22
...

需求:如下图数据库表名为test1,含有两个字段(A,B)。要求找出B字段不含有bc的值

    A    B
	1	abcd
	2	
	3	
	4	
	5	
	6	

一.以Oracle数据库为例子。
Oracle版本:Oracle Database 11g
实验开始:
1.建表:

create table test1(
a varchar2(10),
b varchar2(10)
);

2.向表中插入数据


insert into test1 (A, B)
values ('1', 'abcd');

insert into test1 (A, B)
values ('2', null);

insert into test1 (A, B)
values ('3', null);

insert into test1 (A, B)
values ('4', null);

insert into test1 (A, B)
values ('5', null);

insert into test1 (A, B)
values ('6', null);

insert into test1 (A, B)
values ('7', null);
commit;

3.需求方案:
坑一:

SELECT * FROM TEST1 t WHERE t.b   LIKE '%b%';

如果这样写的话,得到的结果集是没有数据的。因为NULL值,不参与like的统计。

正确的处理方案:

SELECT *
  FROM (SELECT t.a a, decode(t.b, null, '1', t.b) b FROM TEST1 t) k
 WHERE k.b NOT LIKE '%b%';

方案思想:
将原始字段中数据为null的值,用其他值来代替,构成一个内查询。在外查询上处理模糊查询。

二.MySQL数据库为例
数据库版本:5.7.32(试了一下MySQL8.0.16,也是没有decode函数的)

1.建表

create table test1(
a varchar(10),
b varchar(10)
);

2.插入数据


insert into test1 (A, B)
values ('1', 'abcd');

insert into test1 (A, B)
values ('2', null);

insert into test1 (A, B)
values ('3', null);

insert into test1 (A, B)
values ('4', null);

insert into test1 (A, B)
values ('5', null);

insert into test1 (A, B)
values ('6', null);

insert into test1 (A, B)
values ('7', null);

坑一:同Oracle

正确的解决方案(适用于MySQL5.7和MySQL8):

SELECT
  *
FROM
  (
  SELECT
    t.a a,
    CASE
      WHEN t.b IS NULL THEN '1'
      ELSE t.b
    END AS b
  FROM
    test1 t)k
WHERE
  k.b NOT LIKE '%bc%';

在数据库没有decode函数的情况下,用case when替代即可。思想同Oracle版本。