使用选定的列创建另一个组合 Postgresql 中所有字段的字符串插值?

Som*_*ood 6 sql postgresql select

我有这个大型 Postgresql 查询(为了简洁起见,仅发布 Select):

SELECT
v.id AS visit_id,
a. "type" AS account_type,
a.full_name AS member,
papa.full_name AS papa,
pal_account.full_name AS papa_pal,
pal_account.email AS pal_email,
visit_location. "state" AS visit_location,
to_char(v.scheduled_for::timestamp AT time zone 'UT', 'YYYY-MM-DD HH:MI AM') AS scheduled_for,
to_char(v.started_at::timestamp AT time zone 'UT', 'YYYY-MM-DD HH:MI AM') AS start_time,
to_char(v.completed_at::timestamp AT time zone 'UT', 'YYYY-MM-DD HH:MI AM') AS end_time,
TRUNC((EXTRACT(EPOCH FROM (v.completed_at - v.started_at)) / 60)::numeric, 2) AS minutes,
TRUNC((EXTRACT(EPOCH FROM (v.completed_at - v.started_at)) / 60 / 60)::numeric, 2) AS hours,
Run Code Online (Sandbox Code Playgroud)

我想添加另一个名为 的列,它将我在其中Overview选择的pal_pal,scheduled_forhours字段组合成一个字符串:

Overview: "Name: ${papa_pal}\nDate: ${scheduled_for\nHours: ${hours}"
Run Code Online (Sandbox Code Playgroud)

关于如何实现这一目标有什么建议吗?

尝试仅使用这些字段,我收到此错误:

询问:

SELECT
    v.id AS visit_id,   
    a. "type" AS account_type,
    a.full_name AS member,
    papa.full_name AS papa,
    pal_account.full_name AS papa_pal,
    pal_account.email AS pal_email,
    visit_location. "state" AS visit_location,
    to_char(v.scheduled_for::timestamp AT time zone 'UT', 'YYYY-MM-DD HH:MI AM') AS scheduled_for,
    to_char(v.started_at::timestamp AT time zone 'UT', 'YYYY-MM-DD HH:MI AM') AS start_time,
    to_char(v.completed_at::timestamp AT time zone 'UT', 'YYYY-MM-DD HH:MI AM') AS end_time,
    TRUNC((EXTRACT(EPOCH FROM (v.completed_at - v.started_at)) / 60)::numeric, 2) AS minutes,
    TRUNC((EXTRACT(EPOCH FROM (v.completed_at - v.started_at)) / 60 / 60)::numeric, 2) AS hours,
    CASE WHEN v.visit_distance IS NOT NULL THEN
        v.visit_distance / 1609.34
    ELSE
        sum(paths.visit_distance) / 1609.34
    END AS total_visit_distance,
    CASE WHEN v.commute_distance IS NOT NULL THEN
        v.commute_distance / 1609.34
    ELSE
        sum(paths.commute_distance) / 1609.34
    END AS total_commute_distance,
    format('Overview: "Name: %s\nDate: %s\nHours: %s"', papa_pal, scheduled_for, hours) as overview,
    (
        SELECT
            (plans.data::json -> 'metadata' ->> 'hourly_rate')::INTEGER / 100
        FROM
            plans
        WHERE
            plans.data -> 'id' = a.stripe_plan -> 'id') AS member_rate
Run Code Online (Sandbox Code Playgroud)

错误:

 Query 1 ERROR: ERROR:  column "papa_pal" does not exist
LINE 24: ...rmat('Overview: "Name: %s\nDate: %s\nHours: %s"', papa_pal, ...
                                                              ^
HINT:  Perhaps you meant to reference the column "v.papa_id" or the column "visit_location.papa_id".
Run Code Online (Sandbox Code Playgroud)

ric*_*yen 4

您应该能够使用该format()功能:

SELECT
v.id AS visit_id,
...
TRUNC((EXTRACT(EPOCH FROM (v.completed_at - v.started_at)) / 60 / 60)::numeric, 2) AS hours,
format('Overview: "Name: %s\nDate: %s\nHours: %s"', pal_account.full_name, to_char(v.scheduled_for::timestamp AT time zone 'UT', 'YYYY-MM-DD HH:MI AM'), TRUNC((EXTRACT(EPOCH FROM (v.completed_at - v.started_at)) / 60 / 60)::numeric, 2)) as overview
FROM ...
WHERE ...
Run Code Online (Sandbox Code Playgroud)

您可能还想转换TRUNC((EXTRACT(EPOCH FROM (v.completed_at - v.started_at)) / 60 / 60)::numeric, 2)date_part('hour',v.completed_at - v.started_at)