我有一个 160 字符的位字符串,我需要一个整数数组来存储值为 1 的位的位置。
例子:
bitstring = '00110101'
array = [3,4,6,8]
是否可以仅使用 SQL 来执行此操作,或者我是否需要定义一个 PL/SQL 函数或类似的东西?
我有一个 160 字符的位字符串,我需要一个整数数组来存储值为 1 的位的位置。
例子:
bitstring = '00110101'
array = [3,4,6,8]
是否可以仅使用 SQL 来执行此操作,或者我是否需要定义一个 PL/SQL 函数或类似的东西?
肯定可以用 SQL 编写它。这是一个起点:
select array(
select substring(str from i for 1) as bit
from generate_series(1, length(str)) as i
where bit = '1'
);
不过,您可能希望将其包装在 pl/sql 函数中,以避免到处重复代码。
工作功能:
create or replace function get_bit_positions(varbit) returns bit[] as $$
select array(
select substring($1 from i for 1) as bit
from generate_series(1, length($1)) as i
where substring($1 from i for 1) = '1'
);
$$ language sql immutable;
工作版本:
WITH x AS (SELECT '00110101'::varbit AS b)
SELECT array_agg(i)
FROM (SELECT b, generate_series(1, length(b)) AS i FROM x) y
WHERE substring(b, i, 1) = '1';
转换varbit
为text[]
. 投射到text
并运行string_to_array()
。
然后您可以generate_subscripts()
按索引使用和选择数组元素:
WITH x AS (SELECT string_to_array('00110101'::varbit::text, NULL) AS b)
SELECT array_agg(i)
FROM (SELECT b, generate_subscripts(b,1) AS i FROM x) y
WHERE b[i] = '1'
有关 dba.SE的相关问题的详细信息。