在postgres中获取格式化的列值

时间:2015-10-16 13:49:53

标签: postgresql split

我的表格中有一列格式为:

COURSE_214/MODULE_5825/SUBMODULE_123/..../GOAL_124/ACTIVITY_125.

我需要目标的价值,即来自goal_124的124。我打算使用'regexp_split_to_array',但不知道如何使用数组中的元素。

我正在使用postgres 9.2。

3 个答案:

答案 0 :(得分:1)

你可以这样使用split_part

select split_part(split_part('COURSE_214/MODULE_5825/SUBMODULE_123/..../GOAL_124/ACTIVITY_125', '/GOAL_', 2), '/', 1)
i.e.
select split_part(split_part(fieldname, '/GOAL_', 2), '/', 1)

Result:
124

答案 1 :(得分:1)

使用json_object()

select json_object(string_to_array(translate(params, '_', '/'), '/'))
from test

                                          json_object                                           
------------------------------------------------------------------------------------------------
 {"COURSE" : "214", "MODULE" : "5825", "SUBMODULE" : "123", "GOAL" : "124", "ACTIVITY" : "125"}
(1 row)

select json_object(string_to_array(translate(params, '_', '/'), '/'))->>'GOAL' as goal
from test

 goal 
------
 124
(1 row) 

该列的格式适合json。我建议将列的类型更改为jsonb。第一个查询可以用作转换器。 转换后,您将以简单的方式访问参数,例如:

select *
from test
where params->>'COURSE' = '214'
and (params->>'GOAL')::int > 120;

简单选择所有GOAL_个参数(如果有多个参数)

select ltrim(elem, 'GOAL_')
from (
    select unnest(string_to_array(params, '/')) elem
    from test
    ) sub
where elem like 'GOAL_%'

答案 2 :(得分:0)

您可以尝试使用正则表达式,在斜杠之间获取字符串

select substring(your_column from '^.*/(.*)/.*$') from your_table

如果您希望在该部分找到GOAL值,请使用

select substring(your_column from '/GOAL_(.*)/') from your_table