2016-11-07 26 views
1

由於後續前面的問題:Postgres的FROM查詢與列名的一個

我有以下查詢:

SELECT row_number() OVER (ORDER BY t.id) AS id 
    , t.id AS "RID" 
    , count(DISTINCT a.ord) AS "Matches" 
FROM tbl t 
LEFT JOIN (
    unnest(array_content) WITH ORDINALITY x(elem, ord) 
    CROSS JOIN LATERAL 
    unnest(string_to_array(elem, ',')) txt 
    ) a ON t.description ~ a.txt 
     OR t.additional_info ~ a.txt 
GROUP BY t.id; 

這給了我匹配正確,但現在array_content的值需要是動態的,並且也是列值之一。

比方說,我使用的是聚合函數來獲取查詢作爲內數組內容:

SELECT row_number() OVER (ORDER BY t.id) AS id 
    , t.id AS "RID" 
    , array_agg(DISTINCT demo_a.element_demo) as array_values 
    , count(DISTINCT a.ord) AS "Matches" 
    , count(DISTINCT demo_a.ord) AS "Demo_Matches" 
FROM tbl t 
LEFT JOIN (
    unnest(array_values) WITH ORDINALITY x(elem, ord) 
    CROSS JOIN LATERAL 
    unnest(string_to_array(elem, ',')) txt 
    ) a ON t.description ~ a.txt 
     OR t.additional_info ~ a.txt 
LEFT JOIN (
    unnest("test1","test2"::varchar[]) WITH ORDINALITY x(element_demo, ord) 
    CROSS JOIN LATERAL 
    unnest(string_to_array(element_demo, ',')) text 
    ) demo_a ON i.name ~ demo_a.text 
GROUP BY t.id; 

現在我需要的是在地方,那就是在UNNEST部分定義array_content的拿到array_values列。可能嗎? 現在它給出了一個例外,列名未定義。

+0

增加的雙重UNNEST很簡單陣列'{「測試」,「測試1」}'是沒有意義的。一個單一的'unnest()'已經不是所有的都是unnest ... –

+0

另外,你的兩個LEFT JOIN子查詢之間的代理CROSS JOIN幾乎肯定是錯誤的。考慮fishmarket示例:http://stackoverflow.com/questions/12464037/two-sql-left-joins-produce-incorrect-result/12464135#12464135 –

+0

但@Erwin這2個左連接服務於不同的目的。 –

回答

0

現在它給出了一個例外,列名未定義。

這是因爲您使用的是不同的列名 a.obj_element 。在子查詢中,我們將列名爲elem。 (還是你真的要使用txt?)所以:

SELECT row_number() OVER (ORDER BY t.id) AS id 
    , t.id AS "RID" 
    , array_agg(DISTINCT a.elem) AS array_values -- or a.txt? 
    , count(DISTINCT a.ord) AS "Matches" 
FROM tbl t 
LEFT JOIN (
    unnest(array_content) WITH ORDINALITY x(elem, ord) 
    CROSS JOIN LATERAL 
    unnest(string_to_array(elem, ',')) txt 
    ) a ON t.description ~ a.txt 
     OR t.additional_info ~ a.txt 
GROUP BY t.id; 
+0

它仍然給出錯誤.. array_values不存在.... –

+0

@SyedAsadAbbasZaidi:哦,你也重命名輸入列'array_content' - 我錯誤地認爲? –