Я думаю, вам лучше выбрать максимальную длину для вашего 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 фильтрует только те строки, в которых работает строковая подстрока