Postgresql在json数组上留下外连接

bin*_*lon 7 postgresql json

我想知道是否可以在表列的json_array_elements和另一个表之间进行左外连接?像下面的东西,但这不起作用.

SELECT *
FROM foo,
    json_array_elements (foo.bars :: json) foo_bars
LEFT OUTER JOIN bar ON (foo_bars ->> 'id') :: BIGINT = bar.ID;
Run Code Online (Sandbox Code Playgroud)

表结构如下所示

FOO
 ------------------------------------------
|  ID  | NAME |            BARS            |
|------------------------------------------|
|  1   | FOO1 | [{ "id" : 1}, { "id" : 2 }]|
|------------------------------------------|
|  2   | FOO1 |             []             |
 ------------------------------------------

BAR
 -------------
|  ID  | NAME |
|-------------|
|  1   | BAR1 |
|-------------|
|  2   | BAR2 |
 -------------
Run Code Online (Sandbox Code Playgroud)

我希望查询的输出是

 --------------------------------------------------------
|  ID  | NAME |            BARS            |  ID  | NAME |
|------------------------------------------|-------------|
|  1   | FOO1 | [{ "id" : 1}, { "id" : 2 }]|  1   | BAR1 |
|------------------------------------------|-------------|
|  1   | FOO1 | [{ "id" : 1}, { "id" : 2 }]|  2   | BAR2 |
|------------------------------------------|-------------|
|  2   | FOO1 |             []             | null | null |
 --------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

Jak*_*nia 15

要回答您的问题:是的,这是可能的,您的查询就是这样.我们可以通过在foo表格中引入第三行来证明这一点:http: //sqlfiddle.com/#!15/06dfe/2

你的问题不是LEFT JOIN用于json_array_elements隐式横向交叉连接.您的查询相当于:

SELECT *
FROM foo 
  CROSS JOIN LATERAL json_array_elements (foo.bars :: json) foo_bars 
  LEFT OUTER JOIN bar ON (foo_bars ->> 'id') :: BIGINT = bar.ID;
Run Code Online (Sandbox Code Playgroud)

http://sqlfiddle.com/#!15/06dfe/5

你想要的是在foo和之间的左侧连接json_array_elements:

SELECT *
FROM foo LEFT JOIN LATERAL
    json_array_elements (foo.bars :: json) foo_bars ON true
LEFT OUTER JOIN bar ON (foo_bars ->> 'id') :: BIGINT = bar.ID;
Run Code Online (Sandbox Code Playgroud)

http://sqlfiddle.com/#!15/06dfe/6

  • 这很好用。甚至也适用于 null json。我以前也从未听说过 SQL Fiddle。我希望我能给你 100 个赞成票。 (2认同)