我正在尝试测试json
PostgreSQL 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专家,所以我不知道我做错了什么.
最近升级到使用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的电子邮件""?
我在匹配表中有以下数据:
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)
但这回归:
Run Code Online (Sandbox Code Playgroud)ERROR: could not identify an equality operator for type json SQL state: 42883 Character: 1680
我知道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) 我需要将为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是一个表值函数.我不能放置这个函数的代码,因为它真的很大,它会使一些困难的计算,我不能放弃它.
给定一个如此定义的表:
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()
函数的解决方案是什么样的,但是它已经空洞了.
即使在阵列被扩展且没有主键的情况下存在大量列的情况下,理想的解决方案也将易于使用.处理具有多个数组的案例并不重要.
我正在尝试调用存储过程在左外连接中传递参数,如下所示:
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()
.
我有一个变体数据类型,我正在对其执行横向展平,但随后我需要左连接其中一个 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) 我正在尝试生成下表:
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) 我正在尝试连接返回行的表和函数:
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上它显示以下错误:
Run Code Online (Sandbox Code Playgroud)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
我无法将函数中的计算移出到查询中.根据我的理解,我
不能使用JOIN LATERAL这是9.3中的新功能.
这个问题有解决方法吗?
我的用例是我在配置单元中有一张表,其中一列为INT,另一列为Array数据类型。我想水平显示它。
lateral ×10
postgresql ×8
sql ×8
json ×3
join ×2
arrays ×1
cross-apply ×1
flatten ×1
hive ×1
jsonb ×1
left-join ×1
sample ×1
snowflake-cloud-data-platform ×1
view ×1