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_for
和hours
字段组合成一个字符串:
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)
您应该能够使用该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)