我试图在这里彻底搜索,但没有找到任何答案。
我有一个 PostgreSQL 数据库,它有两个主表:
这两个表有不同的关系。用户可以:
... 一份文件。
问题是我应该如何保存这些关系?
根据我使用 MySQL 的经验,显而易见的方法是为这些多对多关系创建表,包含user_id和document_id.
但是,因为我们使用PostgreSQL,它具有惊人的JSON支持,我们想也许更好的做法是有一个user_document表,其中包含user_id,document_id和JSON列包含所有关系。
JSON 将是这样的:
{
'follow' : {'date' : 1523517140, 'doesFollow' : 't'},
'bookmark' : {'date' : null, 'doesBookmark' : 'f'},
....
}
Run Code Online (Sandbox Code Playgroud)
我对 PostgreSQL 的经验几乎为零,我不知道在 JSONB 列上查询的性能。而且我不知道这种方法在 PostgreSQL 中是否有意义。但它似乎没问题,如果它没有任何问题,也许它比第一种正常方法更可取。
我将如何引用类型名称以防止 SQL 注入。例如,拿这个
SELECT FORMAT('SELECT CAST(%L AS %s);', '5.42', 'int');
^ Quote this
Run Code Online (Sandbox Code Playgroud)
这很好用,但如果'int'相反,''int); DROP DATABASE foo;SELECT ('你会遇到一些问题,
SELECT FORMAT('SELECT CAST(%L AS %s);', '5.42', 'int); DROP DATABASE foo;SELECT (');
format
----------------------------------------------------------
SELECT CAST('5.42' AS int); DROP DATABASE foo;SELECT ();
(1 row)
Run Code Online (Sandbox Code Playgroud)
我将如何使用动态 SQL 安全地转换为运行时提供的类型?如果我使用%I而不是%s我得到一个标识符(用 安全引用",但类型名称不是标识符并且不能使用双引号)。
我有一个表,用于表上的多对多关系users来表示用户之间的跟随关系:
CREATE TABLE users (
id text PRIMARY KEY,
username text NOT NULL
);
CREATE TABLE followers (
userid text,
followid text,
PRIMARY KEY (userid, followid),
CONSTRAINT followers_userid_fk FOREIGN KEY (userid) REFERENCES users (id),
CONSTRAINT followers_followid_fk FOREIGN KEY (followid) REFERENCES users (id)
);
CREATE INDEX followers_followid_idx ON followers (followid);
Run Code Online (Sandbox Code Playgroud)
当我想使用与用户相关的数据创建 JSON 响应时,我有两种情况:
用户数据对象应包含两个用户 ID 数组,一个是他们关注的用户,另一个是关注他们的用户。为了创建这两个字段,我使用了以下SELECT语句。
DECLARE follows RECORD;
SELECT array (select followid FROM followers where userid = Puserid) AS following, …Run Code Online (Sandbox Code Playgroud) 我在搭建 PostgreSQL 数据库时遇到问题,因为 npgsql 不能很好地处理同一列上有两个索引的表。这是我在 github 上的项目的链接。
我正在尝试查找这些索引/表,以便可以将它们从脚手架命令中排除。
例子:
CREATE TABLE public.altreproc (
apcod integer NOT NULL,
aptip character(3),
apcam character(3),
CONSTRAINT altreproc_pkey PRIMARY KEY (apcod)
);
CREATE INDEX ialtreproc1
ON public.altreproc
USING btree
(aptip COLLATE pg_catalog."default");
CREATE INDEX ialtreproc2
ON public.altreproc
USING btree
(apcam COLLATE pg_catalog."default");
CREATE INDEX ialtreproc3
ON public.altreproc
USING btree
(aptip COLLATE pg_catalog."default" DESC);
Run Code Online (Sandbox Code Playgroud)
我的问题是当一个表有 2 个不同的索引与相同的列(一个ASC和一个DESC)时;我试图在我试图搭建的数据库中查询这样的表/索引。
我的目标是找到在同一列上包含多个索引的表。
我有一个复杂的SELECT查询表,用于标识event_id和之间的关系attribute。这是一个VALUES表达式的简化:
SELECT event_id, attribute
FROM (
VALUES
(1, '2D'),
(1, 'IMAX'),
(2, 'IMAX'),
(3, '3D')
) event_attribute (event_id, attribute)
Run Code Online (Sandbox Code Playgroud)
我想(event_id, '2D')为每个event_id尚未与3Dor2D属性关联的记录都包含一个额外的记录。如何有条件地将行附加到结果集?
在上表的情况下,预期结果将是:
(1, '2D'),
(1, 'IMAX'),
(2, 'IMAX'),
(2, '2D'),
(3, '3D')
Run Code Online (Sandbox Code Playgroud)
还有一个表格event,每个相关id.
连接运算符||可以连接任何字符串类型的值,返回text. 在 Postgres 中,每种类型都有一个文本表示并且可以转换为text. 因此,引用手册:
但是,字符串连接运算符 (
||) 仍然接受非字符串输入,只要至少一个输入是字符串类型
有关的:
连接一个或多个NULL值产生结果NULL。
test=# SELECT (text 'foo' || NULL) IS NULL
test-# , (text 'bar' || char '1' || NULL ) IS NULL
test-# , (NULL::bigint || text 'baz') IS NULL;
?column? | ?column? | ?column?
----------+----------+----------
t | t | t
Run Code Online (Sandbox Code Playgroud)
是否可以连接 atext和 aNULL值并获得非空结果?
换句话说, …
我有诸如role1、role2、role3等列。它们都是布尔值。
我想在此表上创建一个视图,该视图具有类型为 的角色列text[]。如果有列TRUE, FALSE, TRUE,则视图将包含["role1", "role3"].
有什么好的方法可以做到这一点,并且不会爆炸成大量的CASE WHEN\xc2\xb4s 吗?澄清一下,我可以使用 O(n) CASE WHEN,但不能使用 O(2^n) ,这是目前似乎需要的。:)
我收到此错误:
当我尝试执行以下查询时出现:
with expensive_service as (
select s1.*
from service s1, service s2
where s1.price > s2.price
)
select *
from service except expensive_service;
Run Code Online (Sandbox Code Playgroud)
我试图实现WITH ... AS(链接到 PostgreSQL 文档)。
此查询为我提供了所需的输出:
select *
from service except (
select s1.*
from service s1, service s2
where s1.price > s2.price
)
Run Code Online (Sandbox Code Playgroud)
任何指导我错误所在的帮助将不胜感激!
timestamp我用一列来指示一行是在白天还是晚上创建的。我的代码如下,但由于某种原因,我只得到“DAY”作为结果。我没有正确格式化值吗?
select record_id, rec_date,
case when date_part('hour', rec_date) between 20 and 07 then 'Night'
else 'Day' end as Indicator
from records;
Run Code Online (Sandbox Code Playgroud)
该rec_date列是一个时间戳,我可以在其中看到诸如2019-11-20 21:34:02.000000- 之类的值,它应该得到一个'Night'指标。
varchar(5)当我在查询中使用时INSERT,这意味着表中的属性将在内存中占用5 个字节?(假设一个可打印字符占用一个字节)?
postgresql ×10
many-to-many ×2
array ×1
concat ×1
cte ×1
datatypes ×1
date ×1
date-format ×1
date-math ×1
dynamic-sql ×1
except ×1
index ×1
json ×1
memory ×1
metadata ×1
null ×1
performance ×1
query ×1
storage ×1
unpivot ×1
varchar ×1
view ×1