当表中有指定范围内的数据时返回布尔值
Posted
技术标签:
【中文标题】当表中有指定范围内的数据时返回布尔值【英文标题】:Return Boolean value when table has data in the specified range 【发布时间】:2015-08-07 00:52:17 【问题描述】:当表中有给定范围内的数据时,我需要一个查询来返回布尔值。
假设表 顾客 [用户 ID、姓名、日期、产品_已购买]
我正在尝试:
存在时选择大小写(
选择日期,计数(*) 来自客户
“2015-08-03”和“2015-08-05”之间的日期
)
然后强制转换(1 为 BIT)
else case(0 as BIT)end;
这会在“选择日期”附近引发错误。 然而,奇怪的部分是内部查询运行得非常好。
我想知道我是否在这里遗漏了什么!
【问题讨论】:
“内部查询运行得非常好”:很好,但是在exists
子查询的上下文中计算 count(*)
有意义吗?
是的,这里不需要count(*)。我用它来检查日期的计数。
我猜你是 SQL Server 用户,因为 (1) 你想要一个没有 FROM 的 SELECT 并且 (2) 你需要一个名为 BIT 的数据类型。抱歉,该组合不适用于 Hive(也不适用于 Oracle、DB2 等)
不.. 我是 Java 人.. :D
【参考方案1】:
更直接的事情呢,例如
select case when count(*) >0 then 1 else 0 end as HIT
from ... where ...
这样您就不必担心 Hive 假设 EXISTS 意味着相关子查询,自动转换为 MapJoin,即 Java HashMap 改组到 Mappers 作业的第二行等。不完全是您的用例.
那么计算确切的计数是没有用的,所以查询可以被细化为
select case when count(*) >0 then 1 else 0 end as HIT
from
(select ... from ... where ... limit 1) X
[编辑] Hive 中没有“位”数据类型。但是如果你只想要一个返回标志(零/非零),默认的“int”应该没问题
【讨论】:
感谢您的回复和解释。但我收到错误“失败:解析错误:第 1:55 行无法识别原始类型规范 [DB Errorcode=11] 中的 'bit' ')' 'HIT' 附近的输入”。我在 Spark 0.9 集群上使用 Hive.. 我应该在前面提到过.. 用“smallint”替换“bit” - Hive 中没有 BIT 这样的东西。我的错,我应该实际测试一下。以上是关于当表中有指定范围内的数据时返回布尔值的主要内容,如果未能解决你的问题,请参考以下文章