shell 脚本通过 sql 查询传递列表中的元素

shell script to pass element in a list over a sql query

我有一个参数 $tbl,它包含表列表。例如 (tbl1 tbl2 tbl3)。 现在,根据我的 shell 脚本,我是 运行 如下所示的配置单元查询。

hive -e " select min(column_name) from db.tbl1 
          union all select min(column_name) from db.tbl2 
          union all select min(column_name) from db.tbl3 " > a.txt

现在脚本中的列表可能会有所不同,即如果有时它是 3 个表,那么在下一次迭代中变量可能会存储 4 个表。任何人都可以建议如何对查询进行参数化,以便它将获取中的所有值列表并将其传递到配置单元查询中。

给你:

#!/bin/bash

table=(tbl1 tbl2 tbl3)

# The select takes the 1st table
sql="select min(column_name) from ${table[0]}"

# Remove 1st table
unset table[0]

# Add union statements
for T in ${table[@]}
do
    sql+=$'\n'
    sql+="union all select min(column_name) from db.$T"
done

sql+=";"

echo "$sql"

结果是:

select min(column_name) from tbl1 
union all select min(column_name) from db.tbl2 
union all select min(column_name) from db.tbl3;

  • 第一个table用于select
  • 一旦使用,就会从数组中移除。
  • 然后在剩余的 table 上循环,用于 union 语句。
  • 最后在末尾添加 ;

如果您的查询发生变化,您可以根据需要进行调整。