2017-06-16 41 views
0

我有一些SQL,其具有我試圖從數據庫中列有值替換UNNEST列

with pre as (
with a(k, v) as (select id, my_column from mytable), 
col(s, n) as (select * from unnest(array['Title', 'First', 'Middle', 'Last']) with ordinality c (s, n)) 

我試圖像這樣的東西來代替UNNEST SQL一些硬編碼值:

select unnest(string_to_array(my_column, ':')) as elements from mytable 

mycolumn內容在長度上有所不同,但一個實例可能是標題= AAA:第一= BBB:中間= CCC:最後= DDD

由於

+0

我舉例如何從表而不是「硬編碼選擇回答值」。請詳細說明這個問題 - 如果我們之前沒有聊天,我不明白你的問題。 –

回答

0

我基於我的回答on your previous post。下面是如何可以在序數加入unnest(string_to_array(my_column, ':'))名爲列的例子:

t=# with a as (select id,k,v from my_table, unnest(string_to_array(my_column, ':')) with ordinality as t(k,v)) 
, col(s, n) as (select * from unnest(array['Title', 'First', 'Middle', 'Last']) with ordinality c (s, n)) 
select * from a join col on n=v; 
id |  k  | v | s | n 
----+------------+---+--------+--- 
    1 | title=aaa | 1 | Title | 1 
    1 | first=bbb | 2 | First | 2 
    1 | middle=ccc | 3 | Middle | 3 
    1 | last=ddd | 4 | Last | 4 
(4 rows) 

當然,你將不得不加入不同(基於您以前的帖子)。但是,如果不清楚的部分是如何從表中選擇而不是從值中選擇,那麼上面的示例應該會有所幫助。

更新

認沽值表:

t=# create table keys(t text); 
CREATE TABLE 
Time: 91.908 ms 
t=# insert into keys select unnest(array['Title', 'First', 'Middle', 'Last']); 
INSERT 0 4 
Time: 11.552 ms 
t=# select * from keys ; 
    t 
-------- 
Title 
First 
Middle 
Last 
(4 rows) 

現在加入反對鍵表:

t=# with a as (select id,k,v from my_table, unnest(string_to_array(my_column, ':')) with ordinality as t(k,v)) 
select * from a join keys on split_part(k,'=',1) = lower(t); 
id |  k  | v | t 
----+------------+---+-------- 
    1 | first=bbb | 2 | First 
    1 | last=ddd | 4 | Last 
    1 | middle=ccc | 3 | Middle 
    1 | title=aaa | 1 | Title 
(4 rows) 
+0

這是這部分我有一個select * from unnest(array ['Title','First','Middle','Last']的問題]因爲我不知道這些會是什麼,所以我想從列中獲得值而不是硬編碼它們 – user8159298

+0

@ user8159298更新了答案 –

+0

我仍然感到困惑!如果我說從my_table中選擇my_column,內容可能會是任何東西,如 my_column ---------- 第一= AAA:最後= BBB:中間= CCC:瓶= DDD:表= DDD 在創建表,我需要從價值觀my_column,我不能硬編碼它們,因爲我不知道它們會是什麼,我試圖通過下面的方式來解封my_column:然後用=來分割它們,然後使用=之前的第一部分作爲th e表列名稱。所以我試圖做這樣的事情,但我不知道從my_table選擇unnest(string_to_array(my_column,':'))my_new_column,然後split_part'''' – user8159298