我有一个专栏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;
如何获得全部?
在 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%'
是可选的,可以快速消除没有任何匹配的源行。如果有多个这样的行,则需要付费。
旧版本的详细解释和替代方案:
- PostgreSQL unnest() 与元素编号 https://stackoverflow.com/questions/8760419/postgresql-unnest-with-element-number/8767450#8767450
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)