Tag: postgresql

如何在PostgreSQL中UPSERT(MERGE,INSERT … ON DUPLICATE UPDATE)?

这里一个非常常见的问题是如何做一个upsert,这就是MySQL调用INSERT … ON DUPLICATE UPDATE和标准支持作为MERGE操作的一部分。 鉴于PostgreSQL不直接支持(在第9.5页之前),你如何做到这一点? 考虑以下几点: CREATE TABLE testtable ( id integer PRIMARY KEY, somedata text NOT NULL ); INSERT INTO testtable (id, somedata) VALUES (1, 'fred'), (2, 'bob'); 现在设想你想要“插入”元组(2, 'Joe') , (3, 'Alan') ,所以新的表格内容是: (1, 'fred'), (2, 'Joe'), — Changed value of existing tuple (3, 'Alan') — Added new tuple 这就是人们在讨论一个upsert时候正在讨论的问题。 至关重要的是,任何方法在同一个表上进行多个事务的情况下都必须是安全的 – […]

search_path如何影响标识符parsing和“当前模式”

是否可以定义默认情况下在哪个模式中创build新表? (被称为“不合格的表格名称”。) 我已经看到了在Postgres中使用“searchpath”的一些细节,但是我认为它只能在检索数据而不是创build时使用。 我有一堆SQL脚本,它们创build了很多表。 而不是修改脚本,我想默认设置数据库创build表在一个特定的架构 – 当他们有不合格的名字。 这可能吗?

表名称作为PostgreSQL函数参数

我想在Postgres函数中传递一个表名作为参数。 我试过这个代码: CREATE OR REPLACE FUNCTION some_f(param character varying) RETURNS integer AS $$ BEGIN IF EXISTS (select * from quote_ident($1) where quote_ident($1).id=1) THEN return 1; END IF; return 0; END; $$ LANGUAGE plpgsql; select some_f('table_name'); 我得到这个: ERROR: syntax error at or near "." LINE 4: …elect * from quote_ident($1) where quote_ident($1).id=1)… ^ ********** Error ********** […]

在PostgreSQL中插入重复更新?

几个月前,我从Stack Overflow的一个答案中学习了如何在MySQL中使用以下语法一次执行多个更新: INSERT INTO table (id, field, field2) VALUES (1, A, X), (2, B, Y), (3, C, Z) ON DUPLICATE KEY UPDATE field=VALUES(Col1), field2=VALUES(Col2); 我现在切换到PostgreSQL,显然这是不正确的。 这是指所有正确的表,所以我认为这是一个不同的关键字正在使用的问题,但我不知道这是在PostgreSQL文档涵盖。 为了澄清,我想插入几件事情,如果他们已经存在,以更新它们。

如何筛选具有多对一关系的SQL结果

假设我有桌子student , club和student_club : student { id name } club { id name } student_club { student_id club_id } 我想知道如何find足球(30)和棒球(50)俱乐部的所有学生。 虽然这个查询不起作用,但这是我迄今为止最接近的事情: SELECT student.* FROM student INNER JOIN student_club sc ON student.id = sc.student_id LEFT JOIN club c ON c.id = sc.club_id WHERE c.id = 30 AND c.id = 50

在Rails和PostgreSQL中完全忽略时区

我正在处理Rails和Postgres的date和时间,并且遇到这个问题: 数据库是UTC。 用户在Rails应用程序中设置了一个select的时区,但只有在获取用户本地时间进行比较时才能使用。 用户存储时间,比如2012年3月17日晚上7点。 我不想要时区转换或时区存储。 我只想保存这个date和时间。 这样,如果用户更改了时区,它仍然会显示2012年3月17日晚上7点。 我只使用用户指定的时区在用户本地时区获取当前时间之前或之后的logging。 我目前使用“时间戳没有时区”,但是当我检索logging时,rails(?)将它们转换为应用程序中的时区,这是我不想要的。 Appointment.first.time => Fri, 02 Mar 2012 19:00:00 UTC +00:00 因为数据库中的logging似乎是以UTC出现的,所以我的黑客就是采取当前时间,用'Date.strptime(str,“%m /%d /%Y”)''来删除时区,然后执行我的用这个查询: .where("time >= ?", date_start) 似乎必须有一个简单的方法来忽略周围的时区。 有任何想法吗?

PostgreSQL交叉表查询

有没有人知道如何在PostgreSQL中创build交叉表查询? 例如,我有下面的表格: Section Status Count A Active 1 A Inactive 2 B Active 4 B Inactive 5 我想查询返回以下交叉表: Section Active Inactive A 1 2 B 4 5 这可能吗?

在每个GROUP BY组中select第一行?

正如标题所暗示的,我想select用GROUP BY分组的每一组行的第一行。 具体来说,如果我有一个purchases表,看起来像这样: SELECT * FROM purchases; id | 客户| 总 — + ———- + —— 1 | 乔| 五 2 | 莎莉| 3 3 | 乔| 2 4 | 莎莉| 1 我想查询每个customer所做的最大购买( total )的id 。 像这样的东西: SELECT FIRST(id), customer, FIRST(total) FROM purchases GROUP BY customer ORDER BY total DESC; FIRST(id)| 客户| FIRST(总) ———- + […]

Postgresql GROUP_CONCAT相当于?

我有一个表,我想每个ID拉字段值连接一行。 例如,在我的桌子上,我有这个: TM67 | 4 | 32556 TM67 | 9 | 98200 TM67 | 72 | 22300 TM99 | 2 | 23009 TM99 | 3 | 11200 我想输出: TM67 | 4,9,72 | 32556,98200,22300 TM99 | 2,3 | 23009,11200 在MySQL中,我能够使用聚合函数GROUP_CONCAT ,但似乎并没有在这里工作…是否有一个相当于PostgreSQL,或另一种方式来实现呢?

如何使用新的PostgreSQL JSON数据类型中的字段进行查询?

我正在为PostgreSQL 9.2中的新JSON函数寻找一些文档和/或示例。 具体来说,给出一系列的JSON记录: [ {name: "Toby", occupation: "Software Engineer"}, {name: "Zaphod", occupation: "Galactic President"} ] 我如何编写SQL来查找名称记录? 在香草SQL中: SELECT * from json_data WHERE "name" = "Toby" 官方的开发手册相当稀少: http://www.postgresql.org/docs/devel/static/datatype-json.html http://www.postgresql.org/docs/devel/static/functions-json.html 更新我 我已经汇总了PostgreSQL 9.2目前可能实现的功能 。 使用一些自定义函数,可以执行如下操作: SELECT id, json_string(data,'name') FROM things WHERE json_string(data,'name') LIKE 'G%'; 更新II 我现在已经将我的JSON函数移动到他们自己的项目中了: PostSQL – 将PostgreSQL和PL / v8转换成一个非常棒的JSON文档存储的一组函数