在查询中使用where IN子句的参数不匹配

时间:2019-01-08 22:13:20

标签: sql linux bash hive

我在hive表中有如下列

testing_time
2018-12-31 14:45:55
2018-12-31 15:50:58

现在,我想获取distinct值作为变量,以便可以在其他查​​询中使用。

我已经完成了以下操作

abc=`hive -e "select collect_set(testing_time)) from db.tbl";`

echo $abc

["2018-12-31 14:45:55","2018-12-31 15:50:58"]

xyz=${abc:1:-1}

当我这样做

hive -e "select * from db.tbl where testing_time in ($xyz)"

我遇到错误

Arguments for IN should be the same type! Types are {timestamp IN (string, string)

我在做什么错?

达到我的结果的正确方法是什么?

  
    

注意:我知道我可以在这种情况下使用子查询,但是我想使用变量来实现结果

  

1 个答案:

答案 0 :(得分:1)

问题是您正在将 timestamp (列testing_time)与 string (即"2018-12-31 14:45:55")进行比较,因此您需要转换字符串时间戳记,您可以通过TIMESTAMP(string)进行设置。

这是一个添加转换的bash脚本:

RES=""                             #  here we will save the resulting SQL
IFS=","
read -ra ITEMS <<< "$xyz"          # split timestamps into array
for ITEM in "${ITEMS[@]}"; do
    RES="${RES}TIMESTAMP($ITEM),"  # add the timestamp to RES variable,
                                   # surrounded by TIMESTAMP(x)
done
unset IFS
RES="${RES%?}"                     # delete the extra comma

然后您可以运行构造的SQL查询:

hive -e "select * from db.tbl where testing_time in ($RES)"