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版本。
下一篇: 简单算法(3)顺序查找