2015-05-10 3 views
0

Итак, у меня есть две таблицы: обзоры и survey_ids, где я по существу переношу некоторые данные из survey_ids в опросы.Обновление столбца в другой таблице с комбинированными столбцами

«опросы» имеют один столбец с именем dist_string, который в идеале должен быть комбинацией столбцов «dist_admin» и «dist_user» в survey_ids.

Я хотел сделать обновление на survey.dist_string (которое в настоящее время является «для всех записей»), одновременно сливая два столбца survey_ids.dist_admin и survey_ids.dist_user вместе в survey.dist_string, но я немного застрял. У меня есть другие столбцы в таблице опросов с неопределенным ограничением, поэтому я столкнулся с проблемами, если попытаюсь вставить в dist_string. Есть данные уже в других столбцах, вставленных из survey_ids.

От survey_ids:

dist_admin | dist_user 
--------------+-------------- 
       | 456dfghjk46 
    0987ghasdf7 | 
       | 123ghjwe46c 
       | 5thw67de523 
    4r5thgffghk | 
    2qrt75434th | 
       | 876tjheg3wg 
    9uh7ygwedf6 | 

Я хочу dist_string от съемок, чтобы выглядеть как

dist_string 
------------- 
    456dfghjk46 
    0987ghasdf7 
    123ghjwe46c 
    5thw67de523 
    4r5thgffghk 
    2qrt75434th 
    876tjheg3wg 
    9uh7ygwedf6 

Как это сделать?

Edit: @coalesce, когда я делаю это, я получаю за dist_string:

dist_string 
------------- 

    0987ghasdf7 


    4r5thgffghk 
    2qrt75434th 

    9uh7ygwedf6 

ответ

0

От

SELECT * FROM survey_ids; 
┌────┬────────────┬───────────┐ 
│ id │ dist_admin │ dist_user │ 
├────┼────────────┼───────────┤ 
│ 1 │ (null)  │ ab1  │ 
│ 2 │ cd2  │ (null) │ 
└────┴────────────┴───────────┘ 
(2 rows) 

и

SELECT * FROM surveys;   
┌────┬─────────────┐ 
│ id │ dist_string │ 
├────┼─────────────┤ 
│ 1 │    │ 
│ 2 │    │ 
└────┴─────────────┘ 
(2 rows) 

Запуск

UPDATE surveys 
SET dist_string = COALESCE(dist_admin, dist_user) 
    FROM survey_ids 
    WHERE surveys.id = survey_ids.id 
; 

Обновит surveys к:

SELECT * FROM surveys; 
┌────┬─────────────┐ 
│ id │ dist_string │ 
├────┼─────────────┤ 
│ 1 │ ab1   │ 
│ 2 │ cd2   │ 
└────┴─────────────┘ 
(2 rows) 

В случае значения не NULL пустая строка, используйте:

UPDATE surveys 
SET dist_string = CASE WHEN dist_user = '' THEN dist_admin ELSE dist_user END 
    FROM survey_ids 
    WHERE surveys.id = survey_ids.id 
; 

или, смешивая оба (в случае, если у вас есть пустые строки и NULL ы):

UPDATE surveys 
SET dist_string = CASE 
        WHEN dist_user = '' THEN dist_admin 
        WHEN dist_admin = '' THEN dist_user 
        ELSE COALESCE(dist_admin, dist_user) 
        END 
    FROM survey_ids 
    WHERE surveys.id = survey_ids.id 
; 
+0

Написал это выше, но я напишу его здесь: Обратите внимание, что моя таблица опросов заполняет dist_string только dist_admin в местах, где была заполнена запись dist_admin.Записи с dist_user равны null в dist_string. Почему это может быть? – user2899444

+0

'COALESCE' использует второе значение, если первый имеет значение« NULL ». Если второй - «NULL», он вернет «NULL», или если первый не является «NULL», а (например) пустой строкой, то он будет использовать этот. – Marth

+0

Я просто заметил, что ваш вопрос говорит «объединить два», но ваш пример, похоже, указывает «взять тот, который не является пустым/пустым». Который из них ? – Marth

1

Вы можете использовать COALESCE выбрать ненулевое значение из двух столбцов:

select coalesce(dist_admin, dist_user); 

Так что ваше обновление должно быть, как:

update surveys set dist_sting = coalesce(NULLIF(dist_admin,'') , NULLIF(dist_user,'')) 
FROM survey_ids WHERE surveys.id = survey_ids.id; 
+0

Что об обновлении dist_string с COALESCE? – user2899444

+0

Только что отредактировал мой ответ с вызовом обновления. – Houari

+0

Хорошо, когда я это делаю, я замечаю, что моя таблица опросов заполняет dist_string только dist_admin в местах, где была заполнена запись dist_admin. Почему это может быть? – user2899444

Смежные вопросы