Sql 使用位掩码从行生成多行
让表具有3列:键、值和位掩码(作为varchar;最大长度未知): 是否可以编写查询,在输出中,我将为位掩码中的键、值和Sql 使用位掩码从行生成多行,sql,postgresql,Sql,Postgresql,让表具有3列:键、值和位掩码(作为varchar;最大长度未知): 是否可以编写查询,在输出中,我将为位掩码中的键、值和1的每个组合获得一行,该1的索引作为整数列(从0或1开始不重要)?例如上面的例子: abc | 23 | 1 abc | 23 | 3 xyz | 56 | 4 xyz | 56 | 6 谢谢你的建议 我认为您最好为varchar选择一个最大长度 SELECT * FROM table INNER JOIN generate_series(1,1000) s(n) ON
1
的每个组合获得一行,该1
的索引作为整数列(从0或1开始不重要)?例如上面的例子:
abc | 23 | 1
abc | 23 | 3
xyz | 56 | 4
xyz | 56 | 6
谢谢你的建议 我认为您最好为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 bitmask
--- -------
1 000101
2 000101
3 000101
4 000101
5 000101
6 000101
1 101
2 101
3 101
然后使用s.n对位掩码进行子串,并查找是否等于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
因此,s.n给出了所需输出的最后一列中的数字,where只过滤到字符串子字符串有效的行,这就是我所说的开箱思考-通过正则表达式连接数字序列和过滤。向您致敬,先生,再次感谢:)是的,对不起,我应该解释一下它是如何工作的!
s.n bitmask
--- -------
1 000101
2 000101
3 000101
4 000101
5 000101
6 000101
1 101
2 101
3 101
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