Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用位掩码从行生成多行_Sql_Postgresql - Fatal编程技术网

Sql 使用位掩码从行生成多行

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

让表具有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 
  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