标签: lateral

查询JSON类型中的数组元素

我正在尝试测试jsonPostgreSQL 9.3中的类型.
我在一个json名为data的表中调用了一列reports.JSON看起来像这样:

{
  "objects": [
    {"src":"foo.png"},
    {"src":"bar.png"}
  ],
  "background":"background.png"
}
Run Code Online (Sandbox Code Playgroud)

我想查询表中所有与'objects'数组中'src'值匹配的报告.例如,是否可以在数据库中查询匹配的所有报告'src' = 'foo.png'?我成功写了一个可以匹配的查询"background":

SELECT data AS data FROM reports where data->>'background' = 'background.png'
Run Code Online (Sandbox Code Playgroud)

但由于"objects"有一系列的价值观,我似乎无法写出有用的东西.是否可以在数据库中查询匹配的所有报告'src' = 'foo.png'?我查看了这些来源,但仍然无法得到它:

我也尝试过这样的事情,但无济于事:

SELECT json_array_elements(data->'objects') AS data from reports
WHERE  data->>'src' = 'foo.png';
Run Code Online (Sandbox Code Playgroud)

我不是SQL专家,所以我不知道我做错了什么.

sql postgresql json lateral jsonb

96
推荐指数
2
解决办法
12万
查看次数

在JSON列中查询数组元素

最近升级到使用PostgreSQL 9.3.1来利用JSON功能.在我的表中,我有一个json类型的列,其结构如下:

{
   "id": "123",
   "name": "foo",
   "emails":[
      {
        "id": "123",
        "address": "somethinghere"
      },
      {
        "id": "456",
        "address": "soemthing"
      }
   ]
} 
Run Code Online (Sandbox Code Playgroud)

这只是用于问题目的的虚拟数据.

是否可以根据ID查询电子邮件数组中的特定项?
差不多:"返回id = 123的电子邮件""?

sql postgresql json lateral postgresql-9.3

24
推荐指数
2
解决办法
2万
查看次数

Postgres中的GROUP BY - JSON数据类型不相等?

我在匹配表中有以下数据:

5;{"Id":1,"Teams":[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}],"TeamRank":[1,2]}
6;{"Id":2,"Teams":[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}],"TeamRank":[1,2]}
Run Code Online (Sandbox Code Playgroud)

我想按名称选择表格中每个最后一个不同的团队.即我想要一个将返回的查询:

6;{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}
6;{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}
Run Code Online (Sandbox Code Playgroud)

所以每个团队从上次那个团队出现在表中.
我一直在使用以下(从这里):

WITH t AS (SELECT id, json_array_elements(match->'Teams') AS team FROM matches)
SELECT MAX(id) AS max_id, team FROM t GROUP BY team->'Name';
Run Code Online (Sandbox Code Playgroud)

但这回归:

ERROR: could not identify an equality operator for type json
SQL state: 42883
Character: 1680
Run Code Online (Sandbox Code Playgroud)

我知道Postgres 没有JSON的相等性.我只需要团队名称(字符串)的相等性,该团队中的队员不需要进行比较.

任何人都可以建议另一种方法吗?
以供参考:

SELECT id, json_array_elements(match->'Teams') AS team FROM matches
Run Code Online (Sandbox Code Playgroud)

收益:

5;"{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]}"
5;"{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}"
6;"{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]}"
6;"{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}"
Run Code Online (Sandbox Code Playgroud)

编辑:我转向text并关注这个问题,我用DISTINCT ON而不是GROUP BY.这是我的完整查询:

WITH t AS (SELECT id, …
Run Code Online (Sandbox Code Playgroud)

sql postgresql json greatest-n-per-group lateral

18
推荐指数
1
解决办法
1万
查看次数

Postgres类似于SQL Server中的CROSS APPLY

我需要将为MS SQL Server 2005编写的SQL查询迁移到Postgres 9.1.在此查询中
替换的最佳方法是什么CROSS APPLY

SELECT *
FROM V_CitizenVersions         
CROSS APPLY     
       dbo.GetCitizenRecModified(Citizen, LastName, FirstName, MiddleName,
BirthYear, BirthMonth, BirthDay, ..... ) -- lots of params
Run Code Online (Sandbox Code Playgroud)

GetCitizenRecModified()function是一个表值函数.我不能放置这个函数的代码,因为它真的很大,它会使一些困难的计算,我不能放弃它.

sql postgresql cross-apply postgresql-9.1 lateral

16
推荐指数
2
解决办法
2万
查看次数

PostgreSQL:扁平化与数组的关系,每个数组条目发出一行

给定一个如此定义的表:

CREATE TABLE test_values(name TEXT, values INTEGER[]);
Run Code Online (Sandbox Code Playgroud)

......以及以下值:

| name  | values  |
+-------+---------+
| hello | {1,2,3} |
| world | {4,5,6} |
Run Code Online (Sandbox Code Playgroud)

我正在尝试查找将返回的查询:

| name  | value |
+-------+-------+
| hello | 1     |
| hello | 2     |
| hello | 3     |
| world | 4     |
| world | 5     |
| world | 6     |
Run Code Online (Sandbox Code Playgroud)

我已经回顾了有关访问数组的上游文档,并试图考虑使用unnest()函数的解决方案是什么样的,但是它已经空洞了.

即使在阵列被扩展且没有主键的情况下存在大量列的情况下,理想的解决方案也将易于使用.处理具有多个数组的案例并不重要.

sql arrays postgresql lateral set-returning-functions

9
推荐指数
2
解决办法
7133
查看次数

使用存储过程返回LEFT OUTER JOIN中的SETOF记录

我正在尝试调用存储过程在左外连接中传递参数,如下所示:

select i.name,sp.*
from items i
left join compute_prices(i.id,current_date) as sp(price numeric(15,2), 
          discount numeric(5,2), taxes numeric(5,2)) on 1=1
where i.type = 404;
Run Code Online (Sandbox Code Playgroud)

compute_prices()返回一组记录.
这是postgres显示的消息:

错误:对表"i"的FROM子句条目的无效引用

...左连接compute_prices(i.id,current_date)...

提示:表"i"有一个条目,但不能从查询的这一部分引用它.

这种查询适用于Firebird.有没有办法可以通过使用查询使其工作?我不想创建另一个循环遍历项目并进行单独调用的存储过程compute_prices().

sql postgresql stored-procedures left-join lateral

8
推荐指数
1
解决办法
3037
查看次数

雪花 - 横向不能位于连接的左侧

我有一个变体数据类型,我正在对其执行横向展平,但随后我需要左连接其中一个 json 元素,以从 Snowflake 中的另一个关系表中查找相应 ID 的值。当我这样做时,它会给我错误“横向视图不能位于连接的左侧”,这是没有意义的,因为如果我不包含外部连接,则创建视图,然后在其顶部创建一个附加视图这个视图,它允许我执行左连接。

例子:

create or replace view  my_view
copy grants
as
select 
    rowid as row_id,
    siteData.value:siteID::int as site_id,
    es.site_name AS site_name
from 
    "RAW_DATA" raw, 
    lateral flatten(datamap:data, outer => true) siteData
    LEFT join ext_site es on es.siteid = siteData.value:siteID
;
Run Code Online (Sandbox Code Playgroud)

flatten lateral snowflake-cloud-data-platform

6
推荐指数
1
解决办法
7949
查看次数

Postgres - 两侧带有随机值的横向连接

我正在尝试生成下表:

random person a | random utility 1
random person a | random utility 2
random person a | random utility 3
random person b | random utility 4
random person b | random utility 5
random person b | random utility 6
Run Code Online (Sandbox Code Playgroud)

所以,我想随机生成两个人,为每个人生成 3 个随机实用程序。生成的公用事业不会在人之间共享。

我想出了以下查询:

select              gen_random_uuid() person, utility.utility
from                generate_series(1, 2) person
inner join lateral  (select person, gen_random_uuid() utility from generate_series(1, 3)) utility
on                  person.person = utility.person;
Run Code Online (Sandbox Code Playgroud)

但这会产生以下内容:

64bf364b-ff74-4888-b2d9-0ffcf3147dd7 | f8455aa3-73ab-4432-9c49-2c940da28fa7
05f54217-0316-410d-83e8-2b5306eee143 | 68f7b48-2561-438c-a906-34b141c4adc5
07c23fc3-a6b9-4d74-a611-264c4de9a0bd | 5a597190-09f9-44ea-960d-f6657aa10a81 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql join lateral

5
推荐指数
1
解决办法
514
查看次数

JOIN设置返回功能结果

我正在尝试连接返回行的表和函数:

SELECT p.id, p.name, f.action, f.amount
FROM person p
JOIN calculate_payments(p.id) f(id, action, amount) ON (f.id = p.id);
Run Code Online (Sandbox Code Playgroud)

此函数为每个id返回0,1行或更多行.该查询适用于PostgreSQL 9.3,但在9.1上它显示以下错误:

ERROR:  invalid reference to FROM-clause entry for table "p"
HINT:  There is an entry for table "p", but it cannot be referenced from this part of the query
Run Code Online (Sandbox Code Playgroud)

我无法将函数中的计算移出到查询中.根据我的理解,我
不能使用JOIN LATERAL这是9.3中的新功能.
这个问题有解决方法吗?

sql postgresql join lateral set-returning-functions

4
推荐指数
1
解决办法
6431
查看次数

蜂巢侧视图,带有带有1列作为阵列的蜂巢表的示例示例

我的用例是我在配置单元中有一张表,其中一列为INT,另一列为Array数据类型。我想水平显示它。

hive sample view query-by-example lateral

4
推荐指数
2
解决办法
3万
查看次数