Длинная история...
Я пытаюсь динамически генерировать перекрестный запрос и запускать его как скрипт 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" числовое....и т.д.) за один шаг, если есть рекомендация для достижения этого, мы будем очень признательны.....





Поскольку вы используете двойные кавычки вокруг аргумента, двойные кавычки внутри аргумента должны быть экранированы обратной косой чертой:
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();
что также решает проблему, заключающуюся в том, что ваш исходный запрос имеет случайный символ «,» в конце, а эта форма — нет.
Переписав это следующим образом, select string_agg(quote_ident(runweek::text),' числовой,' упорядочить по runweek) from (выбрать отдельную runweek из календаря, где runweek между current_runweek()-2 и current_runweek() ) a; дает вывод как «432» числовой, «433» числовой, «434», что не совсем то, что я хочу, но я использовал команды оболочки, чтобы добавить отсутствующую «числовую» строку в код... при добавлении строки " numeric ," в подзапросе приводит к месту "" для всей строки, а не только "433" или "432".... но, по крайней мере, у меня есть способ двигаться вперед.... Спасибо...
Если вы запустите это из оболочки (и ваша проблема заключается в цитировании), вы можете использовать здесь-документ.