Как получить вывод SQL с дополнительными специальными символами - PullRequest
0 голосов
/ 27 апреля 2019

Длинная история ...

Я пытаюсь динамически создать запрос кросс-таблицы и запустить его как скрипт psql.

Чтобы добиться этого, мне нужна последняя строка sqlк сгенерированному и добавленному в верхнюю часть sql.

Последняя строка sql выглядит следующим образом .... "as final_result (символ изменяется по-разному," 431 "числовой," 432 "числовой",433 "числовой"; "

. Из них" 431 "," 432 "и т. Д. Должны генерироваться динамически, поскольку это столбцы опорных точек, и они время от времени меняются ...

Поэтому я написал запрос для вывода текста следующим образом ....

psql -c "select distinct '"'||runweek||'" numeric ,' from calendar where runweek between current_runweek()-2 and current_runweek() order by 1;" -U USER -d DBNAME > /tmp/gengen.lst

Хотя sql предоставляет вывод, когда я запускаю его как скрипт, из-за специальных символов (', "",) это не удается.

Как мне заставить его работать?Мой план заключался в том, чтобы пройтись по файлу "lst", построить строку сводки и добавить ее в верхнюю часть sql и выполнить скрипт ... (новичок в postgres, не знает, динамическое создание и выполнение sql и т. Д.).... но я доволен сценариями UNIX ..)

Если бы я мог как-то получить вывод как ("431" числовой, "432" числовой .... и т. д.), если естьРекомендация для достижения этого, будет принята с благодарностью .....

1 Ответ

1 голос
/ 27 апреля 2019

Поскольку вы используете двойные кавычки вокруг аргумента, двойные кавычки внутри аргумента должны быть экранированы обратной косой чертой:

psql -c "select distinct '\"'||runweek||'\" numeric ,' from calendar where runweek between current_runweek()-2 and current_runweek() order by 1;"

Heredoc также можно использовать вместо -c. Он поддерживает многострочное форматирование, что делает все это более читабельным.

(psql [arguments] <<EOF
  select distinct '"'||runweek||'" numeric ,'
     from calendar 
     where runweek between current_runweek()-2 and current_runweek()
   order by 1;
EOF
) > output

Используя quote_ident, который специально предназначен для получения заключенного в кавычки идентификатора из текстового значения, вам даже не нужно добавлять двойные кавычки. Запрос может быть как:

select string_agg( quote_ident(runweek::text), ',' order by runweek)
 from calendar
 where runweek between current_runweek()-2 and current_runweek();

, что также решает проблему, заключающуюся в том, что ваш исходный запрос имеет паразитный символ ',' в конце, тогда как в этой форме его нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...