PostgreSQL: объединение символов в строку без UNIONing SUBSTRINGs - PullRequest
0 голосов
/ 28 февраля 2020

Я новичок в PSQL. Я изучаю существующую базу данных, которая хранит filterbitstring в виде строки 0 и 1, первый символ в строке имеет значение индекса 0, второй, значение индекса 1, до 85-го, имеющего значение индекса (вы уже догадались) 84.

Ради разборчивости я ограничиваю строку здесь 15 символами:

011000001111110

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

0   0
1   1
2   1
3   0
4   0
5   0
6   0
7   0
8   1
9   1
10  1
11  1
12  1
13  1
14  0

У меня есть рабочий запрос, который свидетельствует о настойчивости над элегантностью, и поэтому я ищу более чистое, более элегантное решение, чем это чудовище:

SELECT 0 as "filterindex", cast(substring(df.dsr_filtersbitstring,1,1) as boolean) as "filteractive" FROM public.assaabloy_core_defaultfilters as df UNION
SELECT 1 as "filterindex", cast(substring(df.dsr_filtersbitstring,2,1) as boolean) as "filteractive" FROM public.assaabloy_core_defaultfilters as df UNION
SELECT 2 as "filterindex", cast(substring(df.dsr_filtersbitstring,3,1) as boolean) as "filteractive" FROM public.assaabloy_core_defaultfilters as df UNION
SELECT 3 as "filterindex", cast(substring(df.dsr_filtersbitstring,4,1) as boolean) as "filteractive" FROM public.assaabloy_core_defaultfilters as df UNION
SELECT 4 as "filterindex", cast(substring(df.dsr_filtersbitstring,5,1) as boolean) as "filteractive" FROM public.assaabloy_core_defaultfilters as df UNION
SELECT 5 as "filterindex", cast(substring(df.dsr_filtersbitstring,6,1) as boolean) as "filteractive" FROM public.assaabloy_core_defaultfilters as df UNION
SELECT 6 as "filterindex", cast(substring(df.dsr_filtersbitstring,7,1) as boolean) as "filteractive" FROM public.assaabloy_core_defaultfilters as df UNION
SELECT 7 as "filterindex", cast(substring(df.dsr_filtersbitstring,8,1) as boolean) as "filteractive" FROM public.assaabloy_core_defaultfilters as df UNION
SELECT 8 as "filterindex", cast(substring(df.dsr_filtersbitstring,9,1) as boolean) as "filteractive" FROM public.assaabloy_core_defaultfilters as df UNION
SELECT 9 as "filterindex", cast(substring(df.dsr_filtersbitstring,10,1) as boolean) as "filteractive" FROM public.assaabloy_core_defaultfilters as df UNION
SELECT 10 as "filterindex", cast(substring(df.dsr_filtersbitstring,11,1) as boolean) as "filteractive" FROM public.assaabloy_core_defaultfilters as df UNION
SELECT 11 as "filterindex", cast(substring(df.dsr_filtersbitstring,12,1) as boolean) as "filteractive" FROM public.assaabloy_core_defaultfilters as df UNION
SELECT 12 as "filterindex", cast(substring(df.dsr_filtersbitstring,13,1) as boolean) as "filteractive" FROM public.assaabloy_core_defaultfilters as df UNION
SELECT 13 as "filterindex", cast(substring(df.dsr_filtersbitstring,14,1) as boolean) as "filteractive" FROM public.assaabloy_core_defaultfilters as df UNION
SELECT 14 as "filterindex", cast(substring(df.dsr_filtersbitstring,15,1) as boolean) as "filteractive" FROM public.assaabloy_core_defaultfilters as df

filterbitstring, в настоящее время длиной 85 символов, может вырасти дольше в будущей версии, и поэтому я хотел бы уметь работать с любой длиной, с которой встречается filterbitstring.

Есть ли лучший способ поворота струны?

Заранее спасибо за ваш совет!

Ответы [ 2 ]

1 голос
/ 28 февраля 2020
-- A big thank you to Bohemian for the suggestion!
WITH sq AS
  (SELECT generate_series(0, LENGTH(dsr_filtersbitstring)-1),
          dsr_filtersbitstring
   FROM public.assaabloy_core_defaultfilters)
SELECT DISTINCT sq.generate_series AS "filterindex",
                cast(substring(sq.dsr_filtersbitstring, sq.generate_series+1, 1) AS boolean) AS "filteractive"
FROM sq
ORDER BY filterindex
1 голос
/ 28 февраля 2020

Присоединяйтесь к generate_series()

select ...
from ...
join generate_series(1, 85)
...