-3

flag_acumu在 PostgreSQL 的表中有一个列,其值如下:

'SSNSSNNNNNNNNNNNNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN'

我需要用“S”显示所有位置。使用此代码,我只能获得第一个这样的位置,而不是后面的位置。

SELECT codn_conce, flag_acumu, position('S' IN flag_acumu) AS the_pos 
FROM dh12 
WHERE position('S' IN flag_acumu) != 0 
ORDER BY the_pos ASC;

如何获得所有这些?

4

3 回答 3

2

在 Postgres 9.4或更高版本中,您可以方便unnest()地结合使用WITH ORDINALITY

SELECT *
FROM   dh12 d
JOIN   unnest(string_to_array(d.flag_acumu, NULL))
          WITH ORDINALITY u(elem, the_pos) ON u.elem = 'S'
WHERE  d.flag_acumu LIKE '%S%'  -- optional, see below
ORDER  BY d.codn_conce, u.the_pos;

每个匹配返回一行。 WHERE d.flag_acumu LIKE '%S%'是可选的,以快速消除没有任何匹配的源行。如果有多个这样的行,则支付。

旧版本的详细解释和替代方案:

于 2015-12-28T15:40:37.783 回答
2

由于您没有将您的需求指定到可以正确回答的程度,因此我假设您想要一个子字符串出现位置的列表(长度可能超过 1 个字符)。

这是使用以下功能的功能:

  • FOR .. LOOP控制结构,
  • 功能substr(text, int, int)

CREATE OR REPLACE FUNCTION get_all_positions_of_substring(text, text)
RETURNS text
STABLE
STRICT
LANGUAGE plpgsql
AS $$
DECLARE
  output_text TEXT := '';
BEGIN

FOR i IN 1..length($1)
LOOP
  IF substr($1, i, length($2)) = $2 THEN
    output_text := CONCAT(output_text, ';', i);
  END IF;
END LOOP;

-- Remove first semicolon
output_text := substr(output_text, 2, length(output_text));

RETURN output_text;
END;
$$;

示例调用和输出

postgres=# select * from get_all_positions_of_substring('soklesocmxsoso','so');
 get_all_positions_of_substring
--------------------------------
 1;6;11;13
于 2015-12-28T15:40:02.503 回答
0

这也有效。我认为要快一点。

create or replace function findAllposition(_pat varchar, _tar varchar) 
returns int[] as
$body$
declare _poslist int[]; _pos int;
begin

_pos := position(_pat in _tar);
while (_pos>0)
loop

    if array_length(_poslist,1) is null then
        _poslist := _poslist || (_pos);
    else
        _poslist := _poslist || (_pos + _poslist[array_length(_poslist,1)] + 1);
    end if;

    _tar := substr(_tar, _pos + 1, length(_tar));
    _pos := position(_pat in _tar);

end loop;
return _poslist;

end;
$body$
language plpgsql;

将返回一个位置列表,它是一个 int 数组。

{position1, position2, position3, etc.}
于 2016-01-23T14:42:10.380 回答