今天要做个实验,碰到了在查询时,给where语句中,紧跟where的字段加了引号,导致结果和预期不符的问题,经过偶然的对粘到记事本中的病句的查看,突然想到了老师说过的一句话,在查询语句中,带引号的都是常量这句话,解答了遇到的问题是如何产生的原因。

先看,实验,最后,总结时候说明原委。

有一个 TSubject 表,

mysql> select * from TSubject;

hive sql where后面可以使用正则表达式 sql where后面不能加_mysql


请注意,这个表里有部分记录的个别列是空值。

现在,新建了一个表,ST

mysql> create table ST(subjectid varchar(10),subjectname varchar(30));

hive sql where后面可以使用正则表达式 sql where后面不能加_字段_02

hive sql where后面可以使用正则表达式 sql where后面不能加_database_03

现在,要练习使用命令 mysql> insert into ST(subjectid,subjectname) select subjectid,subjectname from TSubject;将需要的列的值,从 TSubject 复制到 ST 表中。

hive sql where后面可以使用正则表达式 sql where后面不能加_查询语句_04

hive sql where后面可以使用正则表达式 sql where后面不能加_数据库_05


没有问题,9条记录全过来了,

现在,增加难度,把 TSubject 表中 publisher 字段值为 非空的记录 复制到 ST 表中,共5条记录。

hive sql where后面可以使用正则表达式 sql where后面不能加_查询语句_06


为确保实验不受影响,先删除 ST 表 中原有的数据,

mysql> truncate ST;

hive sql where后面可以使用正则表达式 sql where后面不能加_database_07

环境搭建好,开始实验,

mysql> insert into ST(subjectid,subjectname) select subjectid,subjectname from TSubject where ‘publisher’ is null;

hive sql where后面可以使用正则表达式 sql where后面不能加_mysql_08


命令成功了,但随之问题也出现了,

结果中,显示了 9 条记录,而我们在 where 中 已经指定了 字段 publisher 非空,正常返回的结果应该是 5 条才对,

这是为啥捏?再次恢复实验环境,

mysql> truncate ST;

hive sql where后面可以使用正则表达式 sql where后面不能加_database_07

这次把 where 后的字段名 去掉引号试试,

mysql> insert into ST(subjectid,subjectname) select subjectid,subjectname from TSubject where publisher is not null;

hive sql where后面可以使用正则表达式 sql where后面不能加_数据库_10


没问题,返回的就是我们需要的 在 TSubject 表中 publisher 字段 值 不为空的 那 5 条记录。从上面的实验可以看出来,问题就出在 where 后边 字段名 是否有引号包裹上了,

开篇中提到了,老师讲过,在查询语句中,不管什么类型的数据,只要被引号包裹起来,带着引号的它就变成了,常量,而常量永远都不为空的,

所以,where ‘publisher’ is not null 就等价成了 where true,就是 1

hive sql where后面可以使用正则表达式 sql where后面不能加_数据库_11

实际上 where ‘publisher’ is not null 在这里不起任何作用

最后,
mysql> insert into ST(subjectid,subjectname) select subjectid,subjectname from TSubject where publisher is not null;
就和
mysql> insert into ST(subjectid,subjectname) select subjectid,subjectname from TSubject 一样了。

总结,在指定查询条件时, where 后的 字段 一定不要使用括号括起来,那样的话,这个字段就失去了其本身是代表table 列的意义,变成了一个常量,而 where 后接一个 常量 是没有什么意义的。

补充

hive sql where后面可以使用正则表达式 sql where后面不能加_查询语句_12


where 接 常量 没有意义,

January the 13th 2022 Thursday