Генерация нескольких строк из строки с битовой маской - PullRequest
0 голосов
/ 22 ноября 2018

Позволяет иметь таблицу с 3 столбцами: ключ, значение и битовая маска (как varchar; неизвестной максимальной длины):

abc | 23 | 101
xyz | 56 | 000101

Можно ли написать запрос, где на выходе я получу одинстрока для каждой комбинации ключа, значения и 1 в битовой маске с индексом этого 1 в качестве целочисленного столбца (не имеет значения, если начинать с 0 или 1)?Так, например, выше:

abc | 23 | 1
abc | 23 | 3
xyz | 56 | 4
xyz | 56 | 6

Спасибо за любые идеи!

1 Ответ

0 голосов
/ 22 ноября 2018

Я думаю, вам лучше выбрать максимальную длину для вашего varchar.

SELECT * FROM
table 
INNER JOIN
generate_series(1,1000) s(n) 
ON 
  s.n <= char_length(bitmask) and 
  substring(bitmask from s.n for 1) = '1'

Мы создаем список чисел:

s.n
---
1
2
3
4
...

И присоединяем его к таблице вспособ, который вызывает повторяющиеся строки таблицы:

s.n bitmask
--- ------- 
1   000101
2   000101
3   000101
4   000101
5   000101
6   000101
1   101
2   101
3   101

Затем используйте sn для подстановки битовой маски и ищите равным 1:

s.n bitmask substr
--- ------- ------
1   000101  --substring('000101' from 1 for 1) = '1'? no
2   000101  --substring('000101' from 2 for 1) = '1'? no
3   000101  --substring('000101' from 3 for 1) = '1'? no
4   000101  --substring('000101' from 4 for 1) = '1'? yes...
5   000101
6   000101
1   101
2   101
3   101

Таким образом, sn дает нам числов последнем столбце желаемого вывода, а фильтр where фильтрует только те строки, в которых работает строковая подстрока

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