TOP

Hive中where 语句的“不等于”的陷阱
2018-12-06 17:01:54 】 浏览:1204
Tags:Hive where 语句 等于 陷阱

hive 中‘不等于’不管是用! 或者<>符号实现,都会将空值即null过滤掉,此时要用

where (white_level<>'3' or  white_level is null) 
或者 where (white_level!='3' or white_level is null )  来保留null 的情况。

以下知识点来源于:https://blog.csdn.net/liuj2511981/article/details/8702047

1.等值比较: =

语法:A=B

操作类型:所有基本类型

描述: 如果表达式A与表达式B相等,则为TRUE;否则为FALSE

举例:

hive>select 1 from lxw_dual where 1=1;

1

2.不等值比较: <>

语法: A <> B

操作类型: 所有基本类型

描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A与表达式B不相等,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 1 <> 2;

1


注意

由于在通常得SQL写法中不等于也可以这样写 != 。但在hive中,当一个string类型和int类型比较的时候会出现问题。


数字和数字类型用可以用 !=比较:

  1. hive>select*fromt_pvorderwhere1!=1andstart_date=20130306limit1;
  2. OK
  3. Timetaken:0.079seconds


带引号的数字和数字类型可以用!=比较:

  1. hive>select*fromt_pvorderwhere"136258563267"!=0andstart_date=20130306limit1;
  2. OK
  3. 132349939618074113437046875509ec010221310000201-12013-03-0620:59:071362574747440zW420130306
  4. Timetaken:0.169seconds


带引号的数字和带引号数字类型可以用 !=比较:

  1. hive>select*fromt_pvorderwhere"136258563267"!="0"andstart_date=20130306limit1;
  2. OK
  3. 132349939618074113437046875509ec010221310000201-12013-03-0620:59:071362574747440zW420130306
  4. Timetaken:0.129seconds

字符串和数字类型不可以用 !=比较:

  1. hive>select*fromt_pvorderwhere0!="1362585632671uFu"andstart_date=20130306limit1;
  2. TotalMapReducejobs=1
  3. LaunchingJob1outof1
  4. Numberofreducetasksissetto0sincethere'snoreduceoperator
  5. //发起mapreduce查不出结果
  6. ....


字符串和数字类型不可以用 <>比较:

  1. hive>select*fromt_pvorderwhere0<>"1362585632671uFu"andstart_date=20130306limit1;
  2. TotalMapReducejobs=1
  3. LaunchingJob1outof1
  4. Numberofreducetasksissetto0sincethere'snoreduceoperator
  5. //发起mapreduce<spanstyle="font-family:Arial,Helvetica,sans-serif;">查不出结果</span>
  6. ....


总之,用不等于比较的时候两者的字段类型尽量保持一致。


3.小于比较: <

语法: A < B

操作类型: 所有基本类型

描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A小于表达式B,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 1 < 2;

1

4.小于等于比较: <=

语法: A <= B

操作类型: 所有基本类型

描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A小于或者等于表达式B,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 1 <= 1;

1

5.大于比较: >

语法: A > B

操作类型: 所有基本类型

描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A大于表达式B,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 2 > 1;

1

6.大于等于比较: >=

语法: A >= B

操作类型: 所有基本类型

描述: 如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A大于或者等于表达式B,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where 1 >= 1;

1

注意:String的比较要注意(常用的时间比较可以先to_date之后再比较)

hive> select* from lxw_dual;

OK

201111120900:00:00 2011111209

hive> selecta,b,a<b,a>b,a=b from lxw_dual;

201111120900:00:00 2011111209 falsetrue false

7.空值判断: IS NULL

语法: A IS NULL

操作类型: 所有类型

描述: 如果表达式A的值为NULL,则为TRUE;否则为FALSE

举例:

hive> select1 from lxw_dual where null is null;

1

8.非空判断: IS NOTNULL

语法: A IS NOT NULL

操作类型: 所有类型

描述: 如果表达式A的值为NULL,则为FALSE;否则为TRUE

举例:

hive> select1 from lxw_dual where 1 is not null;

1

9. LIKE比较: LIKE

语法: A LIKE B

操作类型: strings

描述: 如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合表达式B 的正则语法,则为TRUE;否则为FALSE。B中字符”_”表示任意单个字符,而字符”%”表示任意数量的字符。

举例:

hive> select1 from lxw_dual where 'football' like 'foot%';

1

hive> select1 from lxw_dual where 'football' like 'foot____';

1

注意:否定比较时候用NOT ALIKE B

hive> select1 from lxw_dual where NOT 'football' like 'fff%';

1

10. JAVA的LIKE操作: RLIKE

语法: A RLIKE B

操作类型: strings

描述: 如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合JAVA正则表达式B的正则语法,则为TRUE;否则为FALSE。

举例:

hive> select1 from lxw_dual where 'footbar’ rlike '^f.*r$’;

1

注意:判断一个字符串是否全为数字:

hive>select 1from lxw_dual where '123456' rlike '^\\d+$';

1

hive> select1 from lxw_dual where '123456aa' rlike '^\\d+$';

11. REGEXP操作: REGEXP

语法: A REGEXP B

操作类型: strings

描述: 功能与RLIKE相同

举例:

hive> select1 from lxw_dual where 'footbar' REGEXP '^f.*r$';

1



Hive中where 语句的“不等于”的陷阱 https://www.cppentry.com/bencandy.php?fid=117&id=195278

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇hive   之 in 能否使用子.. 下一篇Hive实战   函数Find_in_set