Bash-скрипт для запуска SQL-запроса и возврата результата в переменную - PullRequest
0 голосов
/ 19 октября 2019

Я запускаю этот скрипт bash, чтобы подключиться к базе данных PostgreSQL, выполнить какой-либо запрос и просто проверить, возвращает ли он пустой результат или нет. Затем я хочу напечатать, были ли возвращены какие-либо строки.

#!/bin/sh
DATABASE=dbname
USERNAME=user
HOSTNAME=somehost.com
export PGPASSWORD=password

queryResult () {
psql -h $HOSTNAME -U $USERNAME -d $DATABASE <<SQL
SELECT * FROM myTable WHERE valueA > 5.0 OR valueB > 5.0;
IF @@ROWCOUNT > 0 THEN 1 ELSE 0;
SQL
}

valuesFound=$(queryResult)

echo $valuesFound

У меня есть две проблемы с этим:

1) В нем сохраняется результат первого запроса (SELECT * FROM myTable...) в valuesFound и печатает его, а я этого не хочу. Все, что меня волнует, - возвращает ли оператор IF 1 или 0.

2) Второй запрос (IF @@ROWCOUNT...) выдает синтаксическую ошибку: Syntax error at or near IF

Ответы [ 2 ]

3 голосов
/ 19 октября 2019

Я думаю, что ваш сценарий можно упростить, переместив логику в уникальный оператор:

queryResult () {
    psql -h $HOSTNAME -U $USERNAME -d $DATABASE <<SQL
        SELECT CASE WHEN COUNT(*) = 0 THEN 0 ELSE 1 END
        FROM myTable 
        WHERE valueA > 5.0 OR valueB > 5.0;
    SQL
}

Или еще лучше, используя EXISTS, чтобы избежать потенциально дорогостоящей агрегации:

queryResult () {
    psql -h $HOSTNAME -U $USERNAME -d $DATABASE <<SQL
        SELECT CASE WHEN EXISTS (
            SELECT 1 FROM myTable WHERE valueA > 5.0 OR valueB > 5.0
        ) THEN 1 ELSE 0 END;
    SQL
}
1 голос
/ 19 октября 2019

IF @@ROWCOUNT > 0 THEN 1 ELSE 0; - это функция T-SQL, которую PostgreSQL не поддерживает.

Общее решение может быть следующим:

myvar=$(psql -c "<SQL query>")
if [ -z "$myvar" ]; then
    # Do something when no data found
else
    # Data found, handle it
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...