小编Erw*_*ter的帖子

什么是ISNULL()的PostgreSQL等价物

在MS SQL-Server中,我可以这样做:

SELECT ISNULL(Field,'Empty') from Table

但是在PostgreSQL中我遇到了语法错误.我如何模拟ISNULL()功能?

sql-server postgresql null

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

使用空列创建唯一约束

我有一个这种布局的表:

CREATE TABLE Favorites
(
  FavoriteId uuid NOT NULL PRIMARY KEY,
  UserId uuid NOT NULL,
  RecipeId uuid NOT NULL,
  MenuId uuid
)
Run Code Online (Sandbox Code Playgroud)

我想创建一个类似于此的唯一约束:

ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
Run Code Online (Sandbox Code Playgroud)

但是,这将允许多行具有相同的(UserId, RecipeId)if MenuId IS NULL.我想允许NULLMenuId存储不具有关联菜单中的最爱,但我只希望每个用户/食谱对这些行中最多只有一个.

我到目前为止的想法是:

  1. 使用一些硬编码的UUID(例如全零)而不是null.
    但是,MenuId每个用户的菜单都有一个FK约束,所以我必须为每个用户创建一个特殊的"空"菜单,这是一个麻烦.

  2. 使用触发器检查是否存在空条目.
    我认为这是一个麻烦,我喜欢尽可能避免触发器.另外,我不相信他们能保证我的数据永远不会处于不良状态.

  3. 只需忘记它并检查中间件或插入函数中是否存在空条目,并且没有此约束.

我正在使用Postgres 9.0.

我有什么方法可以忽略吗?

sql postgresql null database-design referential-integrity

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

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

我正在为PostgreSQL 9.2中的新JSON函数寻找一些文档和/或示例.

具体来说,给定一系列JSON记录:

[
  {name: "Toby", occupation: "Software Engineer"},
  {name: "Zaphod", occupation: "Galactic President"}
]
Run Code Online (Sandbox Code Playgroud)

如何编写SQL以按名称查找记录?

在vanilla SQL中:

SELECT * from json_data WHERE "name" = "Toby"
Run Code Online (Sandbox Code Playgroud)

官方开发手册非常稀少:

更新我

我已经汇总了详细介绍PostgreSQL 9.2目前可能实现的内容.使用一些自定义函数,可以执行以下操作:

SELECT id, json_string(data,'name') FROM things
WHERE json_string(data,'name') LIKE 'G%';
Run Code Online (Sandbox Code Playgroud)

更新II

我现在已将我的JSON函数移动到他们自己的项目中:

PostSQL - 一组用于将PostgreSQL和PL/v8转换为完全令人敬畏的JSON文档存储的函数

sql postgresql json postgresql-9.2 postgresql-9.3

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

如何加快PostgreSQL中的插入性能

我正在测试Postgres插入性能.我有一个表,其中一列以数字作为数据类型.它上面也有一个索引.我使用此查询填充数据库:

insert into aNumber (id) values (564),(43536),(34560) ...
Run Code Online (Sandbox Code Playgroud)

我通过上面的查询一次非常快速地插入了400万行.数据库达到600万行后,性能每15分钟急剧下降到100万行.有没有提高插入性能的技巧?我需要在这个项目上获得最佳插入性能.

在具有5 GB RAM的计算机上使用Windows 7 Pro.

sql postgresql bulkinsert sql-insert

189
推荐指数
5
解决办法
17万
查看次数

PostgreSQL DISTINCT ON与不同的ORDER BY

我想运行此查询:

SELECT DISTINCT ON (address_id) purchases.address_id, purchases.*
FROM purchases
WHERE purchases.product_id = 1
ORDER BY purchases.purchased_at DESC
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

PG ::错误:错误:SELECT DISTINCT ON表达式必须与初始ORDER BY表达式匹配

添加address_id为第一个ORDER BY表达式会使错误无效,但我真的不想添加排序address_id.是否可以不通过订购address_id

sql postgresql sql-order-by distinct-on

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

为数据库上的用户授予所有权限

我想为用户提供数据库的所有权限,而不是将其作为管理员.我想这样做的原因是,目前DEV和PROD是同一集群上的不同DB,因此我不希望用户能够更改生产对象,但它必须能够更改DEV上的对象.

我试过了:

grant ALL on database MY_DB to group MY_GROUP;
Run Code Online (Sandbox Code Playgroud)

但它似乎没有给予任何许可.

然后我尝试了:

grant all privileges on schema MY_SCHEMA to group MY_GROUP;
Run Code Online (Sandbox Code Playgroud)

它似乎允许我创建对象,但不允许查询属于其他用户的该架构上的\ delete对象

我可以继续在MY_SCHEMA上向用户授予USAGE权限,但是它会抱怨没有权限在桌子上......

所以我想我的问题是:是否有任何简单的方法可以在数据库上为用户提供所有权限?

我正在研究PostgreSQL 8.1.23.

sql postgresql privileges ddl grant

176
推荐指数
5
解决办法
25万
查看次数

将PostgreSQL表中的特定行导出为INSERT SQL脚本

我有一个名为的数据库模式:nyummy和一个名为的表cimory:

create table nyummy.cimory (
  id numeric(10,0) not null,
  name character varying(60) not null,
  city character varying(50) not null,
  CONSTRAINT cimory_pkey PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)

我想将cimory表的数据导出为插入SQL脚本文件.但是,我只想导出城市等于'东京'的记录/数据(假设城市数据都是小写的).

怎么做?

解决方案是否在免费的GUI工具或命令行中无关紧要(尽管GUI工具解决方案更好).我曾尝试过pgAdmin III,但我找不到这样做的选择.

postgresql export insert sql-scripts postgresql-copy

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

在Rails和PostgreSQL中完全忽略时区

我正在处理Rails和Postgres中的日期和时间并遇到这个问题:

数据库采用UTC格式.

用户在Rails应用程序中设置选择的时区,但仅在获取用户本地时间来比较时间时使用.

用户存储时间,例如2012年3月17日晚上7点.我不希望存储时区转换或时区.我只想保存日期和时间.这样,如果用户改变他们的时区,它仍将显示2012年3月17日,晚上7点.

我只使用用户指定的时区来获取用户本地时区当前时间之前或之后的记录.

我目前正在使用"没有时区的时间戳",但是当我检索记录时,rails(?)会将它们转换为应用程序中的时区,这是我不想要的.

Appointment.first.time
 => Fri, 02 Mar 2012 19:00:00 UTC +00:00 
Run Code Online (Sandbox Code Playgroud)

因为数据库中的记录似乎是以UTC形式出现的,我的黑客是用当前时间,用'Date.strptime(str,"%m /%d /%Y")删除时区,然后做我的查询:

.where("time >= ?", date_start)
Run Code Online (Sandbox Code Playgroud)

似乎必须有一种更简单的方法来忽略周围的时区.有任何想法吗?

postgresql timezone datetime ruby-on-rails ruby-on-rails-3

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

检查"空值或空值"的最佳方法

在Postgres sql语句中检查value是null还是空字符串的最佳方法是什么?

值可以是长表达式,因此最好只检查一次.

目前我正在使用:

coalesce( trim(stringexpression),'')=''
Run Code Online (Sandbox Code Playgroud)

但它看起来有点难看.

stringexpression可以是char(n)包含char(n)具有尾随空格的列的列或表达式.

最好的方法是什么?

sql database postgresql null coalesce

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

如果不存在,PostgreSQL创建表

在MySQL脚本中,您可以编写:

CREATE TABLE IF NOT EXISTS foo ...;
Run Code Online (Sandbox Code Playgroud)

... 其他的东西 ...

然后您可以多次运行该脚本而无需重新创建表.

你如何在PostgreSQL中做到这一点?

sql postgresql ddl create-table database-table

148
推荐指数
4
解决办法
17万
查看次数