Преобразовать разделенный запятыми идентификатор в разделенную запятыми строку в postgresql - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть разделенный запятыми столбец, который представляет идентификаторы типа чрезвычайной ситуации, такие как:

ID | Name
1  | 1,2,3 
2  | 1,2
3  | 1

Я хочу сделать запрос, чтобы получить имя поля этого значения.

1 - Ambulance
2 - Fire
3 - Police

ОЖИДАЕМЫЙ ВЫХОД

1 - Ambulance, Fire, Police
2 - Ambulance, Fire
3 - Ambulance

Мне просто нужно написать оператор выбора в postgresql для отображения строковых значений вместо целочисленных значений через запятую.

Ответы [ 3 ]

0 голосов
/ 15 сентября 2018

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

CREATE TABLE public.test1
(
  id integer NOT NULL,
  commastring character varying,
  CONSTRAINT pk_test1 PRIMARY KEY (id)
);

INSERT INTO public.test1
VALUES (1, '1,2,3'), (2, '1,2'), (3, '1');

CREATE TABLE public.test2
(
  id integer NOT NULL,
  description character varying,
  CONSTRAINT pk_test2 PRIMARY KEY (id)
);

INSERT INTO public.test2
VALUES (1, 'Ambulance'), (2, 'Fire'), (3, 'Police');

with descs as
(with splits as 
(SELECT id, split_part(commastring, ',', 1) as col2, 
split_part(commastring, ',', 2) as col3, split_part(commastring, ',', 3) as col4 from test1)
select splits.id, t21.description as d1, t22.description as d2, t23.description as d3
from splits 
inner join test2 t21 on t21.id::character varying = splits.col2
left join test2 t22 on t22.id::character varying = splits.col3
left join test2 t23 on t23.id::character varying = splits.col4)
SELECT descs.id, CASE WHEN d2 IS NOT NULL AND d3 IS NOT NULL 
THEN CONCAT_WS(',', d1,d2,d3) ELSE CASE WHEN d2 IS NOT NULL 
THEN CONCAT_WS(',', d1,d2) ELSE d1 END END FROM descs
ORDER BY id;

В качестве пояснения я даю команды создания таблицы и вставки, чтобы вы (и другие) могли следовать логике. Было бы очень полезно, если бы вы делали это в своих вопросах, так как это экономит время каждого и избегает недопонимания.

Мой внутренний CTE затем разбивает строку, используя split_part. Синтаксис здесь довольно прост: поле, разделитель и требуемый столбец внутри поля, которое нужно разделить (поэтому в этом случае нам нужны один, два и три). Затем я присоединяюсь к разделенным столбцам в test2. Обратите внимание на две вещи: первое соединение - это внутреннее соединение, так как в разбиении всегда будет хотя бы один столбец (я предполагаю !!!), тогда как два других остаются левыми соединениями; во-вторых, разделение поля с изменяющимся символом, в свою очередь, приводит к разделению символов, поэтому я должен привести int id к символу, меняющемуся, чтобы объединение работало. Выполнение приведения таким образом (то есть идентификатор к изменяющемуся символу, а не к изменяющемуся символу для идентификатора) означает, что мне не нужно беспокоиться о нулях. Наконец, в зависимости от количества присутствующих нулей, я объединяю результаты с данным разделителем. Опять же, я предполагаю, что d1 всегда будет иметь значение.

НТН

0 голосов
/ 15 сентября 2018

Значения, разделенные запятыми, являются плохой практикой проектирования баз данных, хотя postgre настолько многофункциональн, что вы легко справитесь с этой задачей.

-- just simulate tables
with t1(ID, Name) as(
    select 1  ,'1,2,3' union all
    select 2  ,'1,2' union all
    select 3  ,'1' 
),
t2(id, name) as(
    select 1, 'Ambulance' union all
    select 2, 'Fire' union all
    select 3, 'Police' 
)

-- here is actual query
select s1.id, string_agg(t2.name, ',') from 
( select id, unnest(string_to_array(Name, ','))::INT as name_id from t1 ) s1
join t2
on s1.name_id = t2.id
group by s1.id

демо

Хотя, если сможешь, измени свой подход. Правильный дизайн базы данных означает простые запросы и лучшую производительность.

0 голосов
/ 15 сентября 2018

Чтобы получить значения для каждого из идентификаторов, нужно выполнить простой запрос: выберите * из;.Когда у вас есть значения, вам нужно будет проанализировать строки с разделителем ','.тогда вам нужно будет присвоить проанализированные значения укуса соответствующим названиям должностей и переделать список.Вы пишете это на определенном языке?

или вы можете просто присвоить отсортированному значению что-то вроде 1,2,3, равно «некоторой строке», 1,2 равно «некоторой другой строке» и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...