如何提取postgres中的第一个和剩余的单词

时间:2017-08-20 17:53:45

标签: sql regex postgresql

Postgres数据库表包含char(20)列中用空格分隔的单词。 select语句的结果应该是包含两列的表。

第一列应包含第一个单词。 第二列应包含剩余的单词。 例如

firstword     remainingwords
word11        word12 word13
word21
word31        word32

应该产生

   DECLARE
        inv_money character.money%TYPE;
        CURSOR updmoney IS
            SELECT *
            FROM character
            WHERE id IN (SELECT character_id FROM inst_creature)
        FOR UPDATE OF money;
    BEGIN
        FOR v_character IN updmoney LOOP

          SELECT inst_creature.money
          INTO inv_money
          FROM inst_creature,character
          WHERE inst_creature.character_id = character.ID;

          UPDATE character
          SET money = money+inv_money
          WHERE CURRENT OF updmoney;
        END LOOP;
        COMMIT;
    END;

可以用什么表达代替?标志产生这一点。可以使用一些正则表达式或其他解决方案吗?

使用PostgreSQL 9.1.2

1 个答案:

答案 0 :(得分:2)

将值转换为数组并使用:

select (string_to_array(t, ' '))[1] as first_word,
       (string_to_array(t, ' '))[2:99]
from test;

数组比字符串更容易使用,特别是如果您在一行中有列表。但是,如果您愿意使用array_to_string(),则可以转换回字符串。

在你的Postgres版本中,这更准确地写为:

select (string_to_array(t, ' '))[1] as first_word,
       (string_to_array(t, ' '))[2:cardinality( string_to_array(t, ' ') )]
from test;

在Postgres 9.6中,支持这种速记:

select (string_to_array(t, ' '))[1] as first_word,
       (string_to_array(t, ' '))[2:]
from test;