将数字替换为子查询结果字符串

时间:2015-06-01 21:01:41

标签: regex postgresql

假设我有一个看起来像这样的文本字段:

'number: 123 number: 456'

我希望能够使用此查询的结果替换这些数字:

SELECT name FROM table WHERE number = 123;
SELECT name FROM table WHERE number = 456;

要归还:

'number: apple number: banana'

我有这个查询来识别字符串的整数组件:

select regexp_matches('number: 123 number: 456', '[0-9]{3}', 'g')::int[];

我尝试将该查询用作替换语句中的子查询,但我没有运气:

select regexp_replace('number: 123 number: 456', '[0-9]{3}', (select name from topics where id::text = regexp_matches('number: 123 number: 456', '[0-9]{3}', 'g')));

1 个答案:

答案 0 :(得分:0)

当您想要替换多个值时,我不确定您是否可以单行执行此操作,但这里有一个解决方案如何执行此操作:

SELECT string_agg(strrpl, ' ') AS myString
FROM
(SELECT CASE WHEN t1.name IS NULL 
            THEN tbl.foo 
            ELSE regexp_replace(tbl.foo, t1.id::text, t1.name) END AS strrpl
FROM t1
RIGHT JOIN (SELECT foo FROM regexp_split_to_table((SELECT string 
                                                   FROM t2 
                                                   WHERE id = 1), E'\\s+') AS foo) as tbl
ON tbl.foo ~~ t1.id::text) AS boo;

在这里,我将字符串放入表中,然后从那里选择它们。

另外,我创建了SQL Fiddle,以便您查看它是如何工作的......

这里的主要技巧是将字符串拆分为表格。这行代码:

SELECT foo FROM regexp_split_to_table((SELECT string 
                                       FROM t2 
                                       WHERE id = 1), E'\\s+') AS foo

这个查询基本上将字符串分成一个表,其中字符串中的每个单词都成为表中的一行。 Look HERE!

比我做一个RIGHT JOIN(因为我首先选择FROM t1)并且将t1中的每个名称与我们将字符串拆分为表时得到的表中的相应数字相连接。 Look HERE!

之后我替换了我们在使用t1中的单词分割字符串(foo表)时得到的列中的值,但是如果我们从t1中选择的列中的值为NULL,我们希望保留列foo的值...这一行

SELECT CASE WHEN t1.name IS NULL 
            THEN tbl.foo 
            ELSE regexp_replace(tbl.foo, t1.id::text, t1.name) END

SQL Fiddle为此...

最后我们需要从我们获得的这一列再创建一个字符串。我们使用string_agg函数......

GL!