2016-09-07 3 views
2

Я пытаюсь использовать выражение выбора SQL, чтобы преобразовать следующее из 1-го столбца во второе.Преобразование числового кода в строку слова справа налево

Code  Outcome 
88881133 Species 1, 2, 3, 4 sick 
88888888 NULL 
88888833 Species 1, 2 sick 
88888811 Species 1, 2 sick 
88888111 Species 1, 2, 3 sick 
88888881 Species 1 sick 

Код следует читать справа налево.
1 или 3 означает, что вид болен.
8 означает, что виды не больны.

Я предполагаю, что это включает в себя некоторое выражение CASE, но я не мог идти очень дальше:

SELECT 
CASE WHEN RIGHT(Code, 1) = 1 OR WHEN RIGHT(Code, 1) = 3 
THEN 'Species 1 sick' END AS Outcome 
FROM table 

Я использую базу данных Vertica

ответ

1

Вот еще один метод, только с помощью like и case. Я просто переводил 1 и 3 в 1 и 8 в 0. В основном, потому что я собирался сделать двоичный метод, но это казалось более простым. Настоящая причина состоит в том, чтобы просто упростить утверждение дела (иначе вам нужно проверить как 1, так и 3 случая).

У rtrim есть второй параметр, означающий обрезку только этого дополнительного запятой. Это простой трюк, чтобы удалить последний. Внешний случай - это просто убедиться, что есть виды (иначе он вернет null).

Надеюсь, это поможет.

with translated_mytable as (
    select code, translate(code,'813','011') newcode 
    from mytable 
) 
select Code, 
     case when newcode like '%1%' then 
     'Species ' || 
     rtrim(case when newcode like '_______1' then '1, ' else '' end || 
       case when newcode like '______1_' then '2, ' else '' end || 
       case when newcode like '_____1__' then '3, ' else '' end || 
       case when newcode like '___ 1___' then '4, ' else '' end || 
       case when newcode like '___1____' then '5, ' else '' end || 
       case when newcode like '__1_____' then '6, ' else '' end || 
       case when newcode like '_1______' then '7, ' else '' end || 
       case when newcode like '1_______' then '8, ' else '' end, 
     ', ') || ' sick' 
     end Outcome   
from translated_mytable 
+0

Привет, woot, ваш скрипт, похоже, захватывает только «1». Как я могу изменить его так, чтобы у меня было как «1», так и «3», чтобы указать на то, что вы тоже больны? (извините, что я опубликовал это гораздо раньше, но, видимо, это не получилось) – Jake

+0

@ Jake Если вы посмотрите внимательно, я перевел 1 и 3 в 1, чтобы упростить условия для подобных случаев. Посмотрите на новый код. 0 для не больных, 1 для больных. – woot

+0

ohhh, спасибо! Позвольте мне сначала попытаться поглотить, многое еще нова для меня :) – Jake

1

Пожалуйста, попробуйте этот запрос - он должен сделать трюк - пожалуйста, просто изменить t_tab в your_table_name и он должен работать

WITH 
t_tab2 AS 
(
SELECT t.code, 
     CASE WHEN SUBSTR(t.code,1,1) IN (1,2,3) THEN 8 END Out1, 
     CASE WHEN SUBSTR(t.code,2,1) IN (1,2,3) THEN 7 END Out2, 
     CASE WHEN SUBSTR(t.code,3,1) IN (1,2,3) THEN 6 END Out3, 
     CASE WHEN SUBSTR(t.code,4,1) IN (1,2,3) THEN 5 END Out4, 
     CASE WHEN SUBSTR(t.code,5,1) IN (1,2,3) THEN 4 END Out5, 
     CASE WHEN SUBSTR(t.code,6,1) IN (1,2,3) THEN 3 END Out6, 
     CASE WHEN SUBSTR(t.code,7,1) IN (1,2,3) THEN 2 END Out7, 
     CASE WHEN SUBSTR(t.code,8,1) IN (1,2,3) THEN 1 END Out8 
FROM t_tab t 
) 
SELECT tt.code, 
     CASE WHEN tt.out1||tt.out2||tt.out3||tt.out4|| 
       tt.out5||tt.out6||tt.out7||tt.out8 IS NULL THEN NULL 
      ELSE REGEXP_REPLACE(
       REGEXP_REPLACE(RTRIM('Species' || ' ' || tt.out8 || ', ' || tt.out7|| ', ' 
                 || tt.out6 || ', ' || tt.out5 || ', ' 
                 || tt.out4 || ', ' || tt.out3 || ', ' 
                 || tt.out2 || ', ' || tt.out1, ', ') 
                 || ' sick', ', | ,', ','), ',{1,}', ', ') END AS Outcome 
FROM t_tab2 tt 

Это дает мне результат:

1 88881133 Species 1, 2, 3, 4 sick 
2 88888888  
3 88888833 Species 1, 2 sick 
4 88888811 Species 1, 2 sick 
5 88888111 Species 1, 2, 3 sick 
6 88888881 Species 1 sick 
+0

Вау, позвольте мне попытаться переварить и вернуться, спасибо заблаговременно! – Jake

+0

Enjoi! Пожалуйста, дайте мне знать, если это сработает для вас. – massko