小编Erw*_*ter的帖子

POSTGRES 在函数中声明包含日期数组的变量

我正在尝试声明一个日期数组。

我试过这个:

DECLARE
dateVal DATE[] := ['2018-01-01','2018-02-01'];
Run Code Online (Sandbox Code Playgroud)

我得到:

ERROR:  syntax error at or near "["
Run Code Online (Sandbox Code Playgroud)

我如何正确声明它?

postgresql plpgsql array

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

Postgres - 如果正则表达式匹配失败则返回默认值

我想尝试正则表达式匹配,null如果失败则返回。

以下查询尝试查找字符串中的第一个数字。结果会忽略带有 text 的条目'blah'。我更希望它返回一个null值。

这个问题可能与正则表达式无关,更多地与集合代数有关。我的预感是,有一种优雅的方法可以做到这一点,而不需要left join任何东西,尽管谷歌搜索被证明是徒劳的。

with test_data as (
  select 'abc 123' as txt
  union
  select 'abc 456' as txt
  union
  select 'blah' as txt
)

select
  txt,
  (regexp_matches(txt, '\d+'))[1] as first_num
from
  test_data
Run Code Online (Sandbox Code Playgroud)

postgresql pattern-matching functions set-returning-functions regex

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

如何确定是否可以内联 SQL 函数?

这个答案中, Erwin 将IMMUTABLE函数分解为可以内联的函数和不能内联的函数。他有一个例子to_char(),表明IMMUTABLE函数 overto_char()实际上会更慢

不过这很有趣,因为我什至不知道to_char()不是IMMUTABLE。此外,我不知道这IMMUTABLE会让任何事情变得更慢。我现在的问题是,如何确定标记为IMMUTABLE内联的函数是否被内联?

postgresql performance optimization execution-plan functions

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

如何在过程(不是函数)中使用变量?

据我了解,在 Postgres 中,过程用于操作数据,函数用于读取数据。我想要:

  1. 声明一个变量
  2. 选择一个值到一个变量中
  3. 将变量插入另一个表
  4. 在事务中执行此操作
  5. 在存储过程中执行此操作
  6. 必要时回滚

CREATE PROCEDURE test_variable()
LANGUAGE SQL
AS $$
    BEGIN;
        DECLARE some_id INTEGER;
        SELECT nextval('some_sequence') INTO some_id;
        INSERT INTO some_table (some_column) VALUES (some_id);
    END;
$$;
Run Code Online (Sandbox Code Playgroud)

以上对我不起作用。当我寻找解决方案时,有很多不同的变量涉及函数$$、声明、事物不返回任何内容;似乎找不到一个简单的例子;我只需要一个清晰的语法示例。

postgresql transaction plpgsql functions sql-procedure

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

Postgres 中的插入和只读表

我想创建一个“不可变”的Postgres数据库,用户只能insert/ select(写入/读取)数据,但不能update/ delete(更改/删除)。

我知道有FOR UPDATE锁,但不知道如何使用它。

假设我有下表,如何使其不可变(或者,如果我理解正确,如何FOR UPDATE永久使用锁)?

CREATE TABLE account(
 user_id serial PRIMARY KEY,
 username VARCHAR (50) UNIQUE NOT NULL,
 password VARCHAR (50) NOT NULL,
 email VARCHAR (355) UNIQUE NOT NULL,
 created_on TIMESTAMP NOT NULL,
 last_login TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud)

postgresql permissions read-only-database

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

Postgres 三元组匹配对于特定字符表现得很奇怪

我正在使用 pg_trgm 运行查询,但在使用符号差异进行搜索时得到很多 1 匹配。我有以下查询:

SELECT my_column, similarity('$ Hello', my_column) AS sml
FROM my_table
WHERE my_column % '$ Hello'
ORDER BY sml DESC, my_column;
Run Code Online (Sandbox Code Playgroud)

在 中my_table,我有以下内容:

- Hello
? Hello
| Hello
$ Hello
! Hello
!? Hello
Run Code Online (Sandbox Code Playgroud)

它们都以 1 的相似性匹配返回。我是否需要转义“$”或类似的内容?

postgresql full-text-search pattern-matching

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

PostgreSQL:将行转换为类型

我读过:使用复合类型创建新表

我有一个名为 的表locations,例如用 lat 表示对象。和长。坐标。

在另一个表中,我声明了一个类型的列locations(只是为了好玩,而不是试图变得聪明),即

CREATE TABLE XXX (..., some_column locations, ...);
Run Code Online (Sandbox Code Playgroud)

现在我在问自己这意味着什么,是否可以locations在其中存储一个对象。

这就是我试图做的:

SELECT pg_typeof(ROW(x)) FROM locations x LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

返回record. 我尝试将其转换为locations,即

SELECT ROW(x)::locations FROM locations X LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

这产生

ERROR:  cannot cast type record to locations
Run Code Online (Sandbox Code Playgroud)

接下来我尝试type_location根据locations表的列定义一个复合类型,并基于它创建一个类型化表( CREATE TABLE ... OF ...)。我仍然无法做到ROW(x)::locations

最终,我试图将一个值存储到XXX类型locations(或type_location)表中,但我不明白我的推理哪一部分是错误的。

PS:我并不是要使用这种结构来创建一个健全的数据库设计,而实际上只是在玩弄 PostgreSQL 及其类型系统。

postgresql datatypes composite-types

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

Postgres 对单词的全文搜索,而不是词素

我有一个包含文本列的表格,我想按word搜索,而不是lexeme。更重要的是,我想按单词而不是词素进行索引。我们有大量代码引用的错误转储,它们不适用于任何自然语言词典。

Postgres 有没有办法让 FTS 按单词边界解析而不将单词解析为词素?如果我必须定义一个边界字符列表和一个跳过词目录,那可能没问题。这是否需要制作某种自定义词典,还是已经有类似的东西可用?

我一直认为我错过了一些明显的东西,然后找不到它。

目前,trigram 索引还可以,但我真的更喜欢文本的唯一关键字解析器。

RDS 上的 Postgres 11.4。

postgresql full-text-search

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

为什么单个 UPDATE 查询会出现死锁?

我有两个进程并行执行这样的代码:

begin;
update foos set unread=false where owner_id=123 and unread=true;
commit;
Run Code Online (Sandbox Code Playgroud)

这会导致死锁。

我对导致死锁的原因的理解就像这个问题中描述的场景,“交织” UPDATE 语句以不同的顺序更新两个不同的行。我不明白单个 UPDATE 语句如何导致死锁。我无法在我的开发环境中使用两个并行 psql 会话来复制死锁场景。我为什么不能复制它的猜测:

  1. 我误解了导致死锁错误的代码,并且每个事务中实际上有多个 UPDATE 语句
  2. “交织”方面正在发生,但“在”涵盖多行的 UPDATE 语句中,因此很难复制。

这个单一的 UPDATE 是否有可能造成死锁?

postgresql deadlock concurrency transaction update

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

如果过滤列有值,则查询结果优先

我有一个"customer_config"包含这些列的表:

company (varchar)
warehouse (numeric)
section (numeric)
config_keyword (varchar)
config_value (varchar)
Run Code Online (Sandbox Code Playgroud)

这两config_*列可以应用于整个公司(warehousesection为空)、公司内的整个仓库(section为空)或仓库内的一个部分。

因此,我们可以为公司设置一个默认行,然后使用一个或多个行来覆盖特定仓库或仓库和部分的配置值。

我只想返回给定公司、仓库和部门的最具体的行。像这样的伪代码:

results = select * from customer_config where (all match)
if results empty
    results = select * from customer_config where (company_code and warehouse match)
if results empty
    results = select * from customer_config where (company_code matches)
Run Code Online (Sandbox Code Playgroud)

最具体的行应优先。

更新

同一级别上可以有多个相同的条目config_keyword
是否也可以为单个关键字返回多行?

postgresql query precedence

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