#sql #linux #bash #select
#sql #linux #bash #выберите
Вопрос:
В скрипте bash я запускаю sql-запрос через ‘psql -c’. Исходя из аргументов, предоставленных сценарию bash, значение where для команды select будет другим. Итак, в принципе, мне нужно знать, возможно ли сделать что-то подобное:
psql -c "select statement here until we get to the where clause at which point we break out of statement and do"
if (arg1 was given)
concatenate "where arg1" to the end of the above select statement
if (arg2 was given)
concatenate "where arg2" to the end of the above select statement
и так далее для любого количества аргументов. Я знаю, что мог бы сделать это намного проще в функции sql, если бы я просто передал аргументы, но на самом деле это не вариант. Спасибо!
Редактировать: через 5 секунд после публикации этого я понимаю, что мог бы просто создать строку перед вызовом команды psql, а затем вызвать команду psql для этого. Ого!
Ответ №1:
psql -c "SELECT columns FROM table ${1: WHERE $1} ${2: WHERE $2}"
При этом используется подстановка «использовать альтернативное значение» — ${VAR: alternate}
— где alternate
подставляется, если $VAR
задано, а не пусто. Если $VAR
пусто, ничего не будет заменено.
Комментарии:
1. Вау — очень приятно. Это избавляет меня от множества ненужных вещей. Спасибо!
Ответ №2:
Сохраните ascript, например query.sh:
#!/bin/bash
query="select statement here until we get to the where clause at which point we break out of statement and do"
if [ $# -gt 0 ]
then
query =" where $1"
shift
fi
while [ $# -gt 0 ]
then
query =" and $1"
shift
fi
psql -c "$query"
Назовите это как
chmod x ./query.sh
./query.sh "id in (1,2,3)" "modified_by='myname'"
Комментарии:
1. После каждого [ и перед каждым] должен быть пробел
Ответ №3:
SQL="select x,y,z FROM foobar"
if [ "$1" != "" ]
then
SQL="$SQL where $1"
fi
psql "$SQL"
Комментарии:
1. Да, жаль, что он не выполняет то, что просил OP. Что происходит с arg2? Также в psql на данный момент отсутствует флаг -c
Ответ №4:
stmt="select statement here until we get to the where clause at which point we break out of statement and do"
if (( $# > 0 ))
then
stmt="$stmt where $1"
fi
if (( $# > 1 ))
then
stmt="$stmt where $2"
fi
psql -c "$stmt"