2016-12-13 7 views
1

мне нужно, чтобы соответствовать по точному набору цифр, а затем заменить с «1» в другой колонке, я могу сделать это с сазе, как следующийточное совпадение цифр в пределах строки и заменить оракул

SELECT 
    CASE PT_6 WHEN '75' THEN '1' ELSE '' END AS PT_6_1 
FROM edrn.pca_patient 
WHERE irid = 4395; 

Однако столбец PT_6 заполняется флажками в приложении, поэтому, когда выбрано несколько флажков, данные составляют 86,75,81.

Мне нужно, чтобы вытащить значение, которое я вводил из строки, и заменить его на 1 в другом столбце, например. PT_6_1. Я играл с некоторыми REGEXP, но не уверен, что могу сделать это в CASE.

В других столбцах, где это будет нужно - Они не все 2 цифры, некоторые из них 3 так я себе представить, если я использовать некоторую форму LIKE, что я мог бы ложно забрать 75 из 175, например

Некоторые примеры данных и дополнительная информация, для этого примера coumn PT_6 есть 6 возможных флажков. Мне нужны все флажки в отдельном столбце как 1 или 0 для отметок или нет, поэтому столбцы - PT_6_1, PT_6_2 и т. Д.

Текущие данные из 4 записей

IRID PT_6 
4395 85,75,87 
3183 85,87 
3219 85 
2180 86 

Так сказать, я хочу, 87 должны быть представлены в колонке PT_6_3 и NULL-х, если совпадения нет, то данные были бы

IRID PT_6_1 PT_6_2 PT_6_3 PT_6_4 PT_6_5 PT_6_6 
4395 null null 1  null null null 
3183 null null 1  null null null 
3219 null null null null null null 
2180 null null null null null null 

Спасибо, Allan

+0

Пожалуйста, после некоторых образцов данных и желаемого результат (как форматированный текст, а не изображения, пожалуйста), чтобы прояснить вашу потребность. – Aleksej

+0

Также у меня такое ощущение, что вы должны нормализовать данные, поступающие из вашего приложения. С CSV трудно работать в базе данных. –

+0

Мы отступаем от этого приложения. Данные экспортируются для новой системы. Новая система является причиной необходимости использования 1 или 0 для «тикания» или «без боя». Я отредактирую исходное сообщение с некоторыми примерами данных – phemor

ответ

2

В ответ на оригинальную версию вопроса:

SELECT TRIM(BOTH ',' FROM REPLACE(','||PT_6||',', ',75,', ',1,')) AS PT_6_1 
FROM edrn.pca_patient 
WHERE irid = 4395; 

В ответ на обновленный вариант вопроса:

SELECT irid, 
     CASE WHEN ','||PT_6||',' LIKE '%,75,%' THEN 1 END AS PT_6_contains_75, 
     CASE WHEN ','||PT_6||',' LIKE '%,85,%' THEN 1 END AS PT_6_contains_85, 
     CASE WHEN ','||PT_6||',' LIKE '%,87,%' THEN 1 END AS PT_6_contains_87 
FROM edrn.pca_patient 
+0

В этом случае, возможно, это не имеет значения, но: если строка ввода использует последовательные запятые для отметки NULL, и если NULL находится в начале или в конце, это означает, что фактическая строка PT_6 может начинаться или заканчиваться одной или несколькими запятыми. ТРИМ будет «проглочен». – mathguy

+0

@mathguy OP упомянул, что это было сделано из флажков (предположительно из HTTP-запроса) - поэтому, полагая, что значение флажков никогда не является пустой строкой, эта ситуация, как вы сказали, никогда не произойдет. Однако 'TRIM' может быть заменен на' SUBSTR', чтобы удалить только первый и последний символы. – MT0

+0

Справа. Очевидно, я был доволен вашим ответом (+1), но просто хотел сделать это понятным для всех, кто может подумать об использовании одного и того же решения для подобных, но не идентичных проблем. – mathguy