Вставьте разделитель между каждым полем таблицы и каждым символом в поле - PullRequest
0 голосов
/ 13 июля 2020

У меня есть таблица с 4 полями - имя, возраст, пол, город. Ниже приведены примеры данных.

введите описание изображения здесь

Мне нужно получить вывод в виде одного столбца со значениями между полями, разделенными знаком «-», и символами внутри значения, разделенными знаком «-»

Вывод: ab- c -d-3-3-malepqr

Я попробовал запрос ниже, который только разграничивает поля.

select trim(case when name is not null then name||'-'end ||case when age is not null then age||'-' end ||
case when sex is not null then sex||'-'end || case when city is not null then city end) from table

Есть ли способ разграничить значения в каждом поле.

Я использую Teradata 16, но если то же самое можно сделать в любой другой СУБД, пожалуйста, помогите.

Ответы [ 4 ]

3 голосов
/ 13 июля 2020

Сначала объедините все столбцы, а затем используйте RegEx для добавления da sh к каждому символу

regexp_replace(coalesce(name,'')||
               coalesce(trim(age),'')||
               coalesce(sex,'')||
               coalesce(city,'')
              ,'(?!^|$)'   -- match every character besides begin and end of line
              ,'\1-')      -- append dash to each match
1 голос
/ 13 июля 2020

попробовать

select
regexp_replace(name,'\B', '-')||'-'||
regexp_replace(age,'\B', '-')||'-'||
regexp_replace(sex,'\B', '-')||'-'||
regexp_replace(city,'\B', '-')
from table
0 голосов
/ 13 июля 2020

Это немного сложное решение, но оно работает нормально.

create or replace function splitjoin(records TEXT[]) returns TEXT[] as $$
declare
cursrow varchar(20) ;
output varchar(30) :='' ;
nums TEXT[] := ARRAY[]::TEXT[];
rec text;
 begin
        FOREACH rec IN ARRAY records LOOP
           FOR counter IN 1..length(rec) BY 1 LOOP
             output=output||'-'||substring(rec,counter,1);
           END LOOP;
         nums =array_append(nums,substring(output,2));
        output='';
      
       END LOOP;
      RETURN nums; 
      end ; $$
     language  plpgsql;

Создайте указанную выше функцию и затем выполните следующую команду выбора

select unnest( splitjoin( (select array(select name||age||sex||city :: text from table  )))::text[]);

Вы передаете массив объединенных записей например, {abcd33malepqr,efgh11femaleabc}, а результат функции также является массивом {a-b-c-d-3-3-m-a-l-e-p-q-r,e-f-g-h-1-1-f-e-m-a-l-e-a-b-c} , поэтому использование unnest в select для возврата записей как

 a-b-c-d-3-3-m-a-l-e-p-q-r
 e-f-g-h-1-1-f-e-m-a-l-e-a-b-c
0 голосов
/ 13 июля 2020

Пожалуйста, используйте запрос ниже. Вы можете использовать предложение WHERE вместо оператора case.

select name||'-'||age||'-'||sex||'-'||city from table
where (trim(name) is not null or trim(age) is not null or trim(sex) is  not nll or 
trim(city) is not null);

Или просто

select name||'-'||age||'-'||sex||'-'||city from table
...