2017-06-16 43 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