小编Erw*_*ter的帖子

将函数参数添加到 SQL 查询 WHERE 子句

我在 Java 中有一个 Web 应用程序,它使用查询。我不想把查询写成Java,所以我做了一个函数:

CREATE OR REPLACE FUNCTION testFunc(inputs text) RETURNS TABLE(...) AS 
$$
    SELECT .... FROM ...
    JOIN ...
    where true
    ;
$$
LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)

我希望函数参数 INPUTS 也位于 WHERE 子句中,因此如果输入是

AND speed = 0 AND ....
Run Code Online (Sandbox Code Playgroud)

Where 子句看起来像

where true AND speed = 0 AND ... 
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

编辑

也可以接受许多参数(a int、b string、c string ..)但是我需要有

WHERE speed = * AND stop = * AND ...
Run Code Online (Sandbox Code Playgroud)

这是不可接受的。我怎样才能做到这一点?

或者我可以在里面放一个 if 语句吗?喜欢

Select .. . from ...
JOIN ... 
WHERE true
IF (a …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql java functions

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

递归 CTE 以找到独特的 slug

我有一个文章表,我希望 slug 是独一无二的。

CREATE TABLE article (
   title char(50) NOT NULL,
   slug  char(50) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

当用户输入标题时,例如News on Apple,我想检查数据库以查看是否存在相应的 slug,例如news-on-apple。如果是这样,我将给一个数值添加后缀,直到找到一个唯一的值,例如news-on-apple-1. 可以通过递归 CTE 查询而不是在我的 ORM 中进行递归来实现。是否有一个很好的大概数字,我应该停止递归和出错。我可以想象人们使用相同的标题 1000 次,这将导致 1000 次查询只是为了创建 1 篇文章。

我对递归 CTE 的理解可能是不正确的,并且没有更好的方法来找到唯一的 slug。请提出任何替代方案。

postgresql database-design cte recursive

7
推荐指数
1
解决办法
1715
查看次数

管理和加速对超过 3 万亿行的 PostgreSQL 表的查询

我有超过 10 年的时间序列数据,有超过 3 万亿行和 10 列。

目前我使用具有 128GB RAM 的 PCIe SSD,我发现查询需要大量时间。例如,运行以下命令需要超过 15 分钟:

SELECT * FROM tbl WHERE column_a = 'value1' AND column_b = 'value2';
Run Code Online (Sandbox Code Playgroud)

该表主要用于读取。写入表的唯一时间是在每周更新期间插入大约 1500 万行。

管理如此大的表的最佳方法是什么?您会建议按年份拆分吗?

表大小为 542 GB,外部大小为 109 GB。

EXPLAIN (BUFFERS, ANALYZE) 输出:

"Seq Scan on table  (cost=0.00..116820941.44 rows=758 width=92) (actual time=0.011..1100643.844 rows=667 loops=1)"
"  Filter: (("COLUMN_A" = 'Value1'::text) AND ("COLUMN_B" = 'Value2'::text))"
"  Rows Removed by Filter: 4121893840"
"  Buffers: shared hit=2 read=56640470 dirtied=476248 written=476216"
"Total runtime: 1100643.967 ms"
Run Code Online (Sandbox Code Playgroud)

该表是使用以下代码创建的:

CREATE TABLE …
Run Code Online (Sandbox Code Playgroud)

postgresql index database-design database-recommendation partitioning

7
推荐指数
1
解决办法
2102
查看次数

死锁最佳实践

我们正在运行 Postgres 9.3,偶尔会出现死锁问题。目前有人注意到并将手动终止进程。当它们发生时,是否有处理这些问题的最佳实践?我知道有一个statement_timeoutlock_timeoutdeadlock_timeout但大多数地方,我读状态,你不想设置此的postgres.conf文件。

只是想看看是否有典型/最佳实践方法。看起来将 deadlock_timeout 设置为 10 分钟就足够了,但我想确保我没有遗漏一些关键的东西,为什么这会是一个坏主意。

postgresql deadlock locking postgresql-9.3

7
推荐指数
1
解决办法
5729
查看次数

如何使用 EXECUTE 在动态 SQL 中使用函数参数?

我在 PostgreSQL 9.5 中编写了一个 PL/pgSQL 函数。它编译得很好,但是当我从 pgAdmin3 调用它时,它给了我一个错误。似乎用函数中传递的参数替换列的动态查询不起作用。

下面是我的功能:

CREATE OR REPLACE FUNCTION insertRecordsForNotification(username text, state     text, district text, organizationId text, bloodGroup text, status text,   approveRejectStatus text, emailSubject text, emailBody text, notificationStatus text) RETURNS boolean AS $$
DECLARE
id int;
r moyadev.user%rowtype;
_where text :=
  concat_ws(' AND '
    , CASE WHEN state IS NOT NULL THEN 'state = $2' END
    , CASE WHEN district IS NOT NULL THEN 'district = $3' END
    , CASE WHEN bloodGroup IS NOT NULL THEN …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql parameter plpgsql postgresql-9.5

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

在postgresql函数中循环jsonb对象的键/值对

我正在尝试在 Postgres 中创建一个函数,该函数可以遍历给定jsonb对象中的每个键/值对。

create or replace function myFunction
(input jsonb)
returns jsonb as $$
BEGIN

    // foreach(key in input)
    //       do some math operation on its corresponding value

    returns input;

END; $$
Run Code Online (Sandbox Code Playgroud)

参数输入应为 jsonb 对象,例如{"a":1, "b":2, "c":3}.

我想遍历对象中的每个键/值对。从我的评论中可以看出,我曾经使用更通用的编程语言(如 c、java 等)编写后端代码。所以我不擅长 SQL。我曾尝试在线搜索,但他们谈论如何遍历jsonb数组而不是对象。所以真的卡在这里了。

postgresql plpgsql json

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

psql \e 的鲁莽行为

psql 13.2 退出编辑器时,无论退出编辑器后如何,都会执行查询缓冲区 - 在这种情况下,缓冲区现在可能保存最近执行的 SQL 查询。

重现:

  1. vim使用\e\e filenamepsql控制台启动编辑器(在我的情况下)。
  2. 输入与否,没有区别。
  3. 取消编辑:q(或:q!强制)

预期行为:回到启动编辑器之前的状态。(我取消了编辑!)
观察到的行为:重新执行上次执行的 SQL 查询。

似乎发生了什么\e

  1. 它执行(相当于)\p,因此当前查询缓冲区包含前一个命令,当它为空时。(编辑文件时用户看不到!) 手册\p

    \p 或者 \print

    将当前查询缓冲区打印到标准输出。如果当前查询缓冲区为空,则打印最近执行的查询。

  2. 启动编辑器。如果提供了文件名,则加载文件,否则加载查询缓冲区。

  3. 如果编辑器以写入结束,则将结果复制到查询缓冲区。
    如果编辑被取消(:q在 vim 中),不要覆盖查询缓冲区。(它现在保存了之前的命令!)

  4. 执行查询缓冲区。或者,准确地说,这样做:

行为似乎可以\p(只是复制查询缓冲区,没有造成任何伤害),但不能\e执行,它可以执行我什至没有看到的命令。

这是一个错误吗?
无论哪种方式,我至少想在离开编辑器时禁用自动执行。但这似乎不可能。或者我错过了什么?

postgresql psql

7
推荐指数
1
解决办法
187
查看次数

用于 EAV 结构存储的 PostgreSQL 与 MySQL

使用 Postgres 9.x 与 MySQL 5.x 存储EAV(实体-属性-值)结构有什么实际区别,或者有什么优势,尤其是在读取性能方面?

postgresql mysql-5 performance database-design eav

6
推荐指数
1
解决办法
1906
查看次数

PostgreSQL:无法运行 repmgr 克隆的数据库

我正在使用 PostgreSQL 热备份运行测试,有 1 个主站,正好有 1 个从站。

我正在使用本指南中的说明:http : //www.howtoforge.com/how-to-set-up-a-postgresql-9.0-hot-standby-streaming-replication-server-with-repmgr-on-opensuse -11.4

我使用的是 PostgreSQL 9.1 版、repmgr 1.1.0 和 Ubuntu 10.04 LTS。

我按照我跑的指南中的步骤进行了步骤 6

repmgr -D /var/lib/postgresql/9.1/main -d pgbench -p 5432 -R postgres --verbose standby clone pgmaster
Run Code Online (Sandbox Code Playgroud)

在 pgslave 上。

然后我做了一个

/etc/init.d/postgresql start
Run Code Online (Sandbox Code Playgroud)

在它上面,脚本(似乎)成功完成。
但是,执行 psql 会引发错误:

psql: FATAL: 数据库系统正在启动

欢迎任何有关进一步进行的帮助。

postgresql replication repmgr

6
推荐指数
1
解决办法
5978
查看次数

如何记录单个连接或用户或客户端主机的所有 SQL 查询?

有没有办法在 Postgres 9.3.9 中记录单个连接或用户或客户端主机的所有 SQL 查询?

换句话说,我log_statement = all只想要某个用户名或客户端主机名或客户端 IP 或连接 ID。

一种选择是记录所有客户端的 SQL 活动并搜索日志。我希望有更好的方法。

postgresql log postgresql-9.3

6
推荐指数
1
解决办法
2448
查看次数