完全忘记了如何正确执行操作,也可能忘记了正确的术语。
长内联输入(我认为这就是所谓的),使用Teradata bteq作为示例客户端读取stdin(与Oracle sql * plus或Sybase isql等相同-因此,几乎可以是任何东西。
bteq <<!
select sql_column1
`if [ "$mode" == "mode1" ]; then`
, sql_column2
`fi`
, sql_column3
from table1
;
!
这里,如果模式是“ mode1”-我输出3个sql_columns,否则输出2个。现在,想象一下这是一个非常大的输入,因此这些条件操作可能非常方便。我很确定我之前已经做过,但是covid-19完全刷新了我的记忆。使用这种语法,我会得到:第xx行的语法错误:'then'不匹配。
我该如何正确操作,以及我在这里所说的a)内联输入正确的Unix术语是什么?和b)内联条件?
如果您希望以多行SQL语句结尾,那么在这种特定情况下,您不需要“此处文档”,因为字符串可以跨越行。只要您的文本没有嵌入的引号,您就可以轻松地做到这一点。
if [ "$mode" == "mode1" ]; then
col2="
, sql_column2"
else
col2=""
fi
stm="select sql_column1$col2
, sql_column3
from table1
;"
echo "stm='$stm'"
如果不需要多行SQL语句,那么代码会更简单。
看起来像Jeff的修订版或本修订版,如果您的“此处文档”和多个条件包含物太长,您都不希望打破逻辑:
bteq <<!
select sql_column1
`if [ "$mode" == "mode1" ]; then
echo \"
, sql_column2
\"
fi`
, sql_column3
from table1
;
!
您可以在很多办法解决你的问题。混合了bteq,SQL,Bash和特殊测试后,别人怎么读您的代码?我认为下一种方法可能会有所帮助:我首先将bteq
替换为cat
进行测试。您可以将测试替换为
[[ "${mode}" == "mode1" ]] && echo ", sql_column2"
你在这里文档中使用这种(使用$(),而不是backtics)结果
cat << END
select sql_column1
$( [[ "${mode}" == "mode1" ]] && echo ", sql_column2")
, sql_column3
from table1
;
EOF
对于读者而言,这并不好。怎么办?发挥作用!
mode1_column() {
[[ "${mode}" == "mode1" ]] && echo ", sql_column2"
}
cat << EOF
select sql_column1
$(mode1_column)
, sql_column3
from table1
;
EOF