当表中有指定范围内的数据时返回布尔值

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 这样的东西。我的错,我应该实际测试一下。

以上是关于当表中有指定范围内的数据时返回布尔值的主要内容,如果未能解决你的问题,请参考以下文章

雪花任务条件:当表有数据时

当表中有多个记录时,在JS中获取隐藏值的问题(Coldfusion)

仅当表中不存在两个 id 的组合时才将值插入表中

当表中的任何值被更新时触发函数更新时间戳属性

仅当表中不存在该值时才更新 SQL 列

java中当表中没有记录,为空的时候,用jpa查询的结果返回的是null吗?