PostgreSQL SELECT и REPLACE несколько строк в одном столбце - PullRequest
0 голосов
/ 04 мая 2018

Какой оптимальный способ заменить несколько строк и вернуть результаты операций замены в одном столбце.

Следующий запрос работает отлично, однако он, очевидно, сгенерировал 5 столбцов.

SELECT 
REPLACE(l.status, 'New Onboarding Request', '1. New Lead'),
REPLACE(l.status, 'Appointment Accepted', '2. Appointment Accepted'),
REPLACE(l.status, 'Accepted', '3. Property Eligible'),
REPLACE(l.status, 'Owner Accepted', '4. Terms Accepted'),
REPLACE(l.status, 'Onboarding', '5. Onboarding'), 
l.id, o.name as partner, v.lat as latitude, v.lng as longitude, v.postcode, 
l.status, v.bedrooms, v.bathrooms, "v"."houseOrFlat", to_char("v"."created_at", 'YYYYMMDD') as valuation_date, to_char("l"."created_at", 'YYYYMMDD') as referral_date, to_char("l"."updated_at", 'YYYYMMDD') as updated,  v.estimated_nightly_rate, v.furnished   FROM valuations v
LEFT JOIN agent_onboarding_requests l on v.id = l.valuation_id
INNER JOIN organisations o on o.id = l.organisation_id
WHERE l.organisation_id != 1
ORDER BY referral_date ASC

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Вы также можете создать встроенную таблицу с помощью VALUES и присоединить ее к существующей таблице:

SELECT
    s.status old_status,
    n.new_status
FROM
  statuses s
JOIN
  (VALUES ('New Onboarding Request', '1. New Lead'),
          ('Appointment Accepted','2. Appointment Accepted'),
          ('Accepted', '3. Property Eligible'),
          ('Owner Accepted', '4. Terms Accepted'),
          ('Onboarding', '5. Onboarding')) n(old_status, new_status)
  ON s.status = n.old_status

или с CTE (WITH):

WITH n(old_status, new_status) AS
(VALUES ('New Onboarding Request', '1. New Lead'),
        ('Appointment Accepted','2. Appointment Accepted'),
        ('Accepted', '3. Property Eligible'),
        ('Owner Accepted', '4. Terms Accepted'),
        ('Onboarding', '5. Onboarding'))
SELECT
    s.status old_status,
    n.new_status
FROM
  statuses s
JOIN n ON s.status = n.old_status
0 голосов
/ 04 мая 2018

В конце концов это показалось мне более элегантным способом, чем вложенная REPLACE

SELECT 

    CASE 
        WHEN(l.status = 'New Onboarding Request') THEN '1. New Lead'
        WHEN(l.status = 'Appointment Accepted') THEN '2. Appointment Accepted'
        WHEN(l.status = 'Accepted') THEN '3. Property Eligible'
        WHEN(l.status = 'Owner Accepted') THEN '4. Terms Accepted'
        WHEN(l.status = 'Onboarding') THEN '5. Onboarding'
    END AS status_modified,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...