2015-10-16 51 views
0

我有格式的值我的表有一欄:越來越格式化列值

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

我需要的價值目標,即124 goal_124。我打算使用'regexp_split_to_array',但不知道如何使用數組中的元素。

我正在使用postgres 9.2。

回答

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 
+0

謝謝...假設有多個'GOAL_'字段......那麼如何得到它? json_object不適用於我,因爲我使用的是postgres 9.2 – Jayant

0

您可以嘗試使用正則表達式,得到斜線之間

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

如果您希望在該部分找到目標值,使用字符串

select substring(your_column from '/GOAL_(.*)/') from your_table 
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_%' 
+0

這是json與string_to_array結合使用的非常好的用法,並且翻譯 – zedfoxus

+0

這不適用於我。 string_to_array()函數返回以下形式的結果:{COURSE,249,MODULE,6312,GOAL,9059,ACTIVITY,8774,ACTIVITY,8800}。當我將它傳遞給json_object()時,出現錯誤:'function json_object(text [])does not exist' – Jayant

+0

要使用'json_object()',你需要Postgres 9.3+(對於'jsonb'類型 - 9.4 +)。 – klin