相关疑难解决方法(0)

PostgreSQL 中 LIKE、SIMILAR TO 或正则表达式的模式匹配

我必须编写一个简单的查询,在其中查找以 B 或 D 开头的人名:

SELECT s.name 
FROM spelers s 
WHERE s.name LIKE 'B%' OR s.name LIKE 'D%'
ORDER BY 1
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法重写它以提高性能。所以我可以避免or和/或like

postgresql index regular-expression pattern-matching string-searching

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

针对多个值的 PostgreSQL JSON 查询数组

我想针对jsonbPostgres中的类型编写一个查询,给定一组客户 ID 将找到相应的组。

鉴于此示例表:

CREATE TABLE grp(d JSONB NOT NULL);

INSERT INTO grp VALUES
   ('{"name":"First","arr":["foo"], "customers":[{"id":"1", "name":"one"},{"id":"2", "name":"two"}]}')
 , ('{"name":"Second","arr":["foo","bar"], "customers":[{"id":"3", "name":"three"},{"id":"4", "name":"four"}]}')
 , ('{"name":"Third","arr":["bar","baz"], "customers":[{"id":"5", "name":"five"},{"id":"6", "name":"seven"}]}');
Run Code Online (Sandbox Code Playgroud)

我发现了类似的问题(针对多个值的 PostgreSql JSONB SELECT)并设法使用此查询在简单数组上实现了我想要的:

SELECT d FROM grp WHERE d->'arr' ?| ARRAY['foo', 'bar'];
Run Code Online (Sandbox Code Playgroud)

但是,当数组包含 JSON对象时,我无法使其工作:

SELECT d FROM grp WHERE d->'customers' ?| ARRAY['{"id":"1"}', '{"id":"5"}'];
Run Code Online (Sandbox Code Playgroud)

这是我对查询的期望:

grp“第一个”-> 客户“1”

grp "第三" -> 客户 "5"

postgresql array json postgresql-9.4

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

LIKE 是如何实现的?

谁能解释一下 LIKE 运算符是如何在当前数据库系统(例如 MySQL 或 Postgres)中实现的?或者指出一些解释它的参考资料?

天真的方法是检查每条记录,在感兴趣的字段上执行正则表达式或部分字符串匹配,但我有一种感觉(希望)这些系统做一些更聪明的事情。

mysql postgresql performance full-text-search pattern-matching

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

当您搜索字符串的中间而不是开头时,它叫什么?

我正在努力提高我的词汇量,以便更好地与我的开发人员交流。我们在站点中有几个地方正在讨论是否应该从头开始搜索字符串,还是应该在字符串中的'running%'任何位置搜索'%running%

我一直将中间搜索称为“模糊”,我意识到这是不正确的,因为模糊意味着改变单词“run”、“runing”[原文如此]、“runed”[原文如此]的形式。

搜索字符串开头和搜索字符串中间的正确术语是什么?

terminology regex string-searching

20
推荐指数
1
解决办法
2185
查看次数

jsonb 可以按*值* 甚至部分值进行快速搜索吗?其他类型?

我有一个person必须插入任意数据的表。由于我使用的是 Postgres 9.4,因此jsonb似乎是正确的选择。

示例数据:

id: 1, name: "Joe Doe", preferences: { color: "red" , toy: "car"}
id: 2, name: "Jane Doe", preferences: { color: "blue", food: "hamburguer" }
Run Code Online (Sandbox Code Playgroud)

问题是我需要通过变量值来查询它,例如:

所有在偏好上有“汉堡包”的人,部分查询也必须是可能的,所以搜索“b​​urg”必须给我带来记录2。

使用json函数,我可以搜索值,只要我知道key,对吗?或者有一种快速搜索值的方法?

我想做的是创建一个 tsvector 列并转储 json 以使用全文搜索来执行部分查询。

postgresql database-design full-text-search json

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

使用更大的运算符在 jsonb 数组中搜索嵌套值

这是表定义(简化):

CREATE TABLE documents (
    document_id int4 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
    data_block jsonb NULL
);
Run Code Online (Sandbox Code Playgroud)

示例值:

INSERT INTO documents (document_id, data_block)
VALUES
   (878979, 
    '{"COMMONS": {"DATE": {"value": "2017-03-11"}},
     "PAYABLE_INVOICE_LINES": [
         {"AMOUNT": {"value": 52408.53}}, 
         {"AMOUNT": {"value": 654.23}}
     ]}')
 , (977656, 
    '{"COMMONS": {"DATE": {"value": "2018-03-11"}},
     "PAYABLE_INVOICE_LINES": [
         {"AMOUNT": {"value": 555.10}}
     ]}');
Run Code Online (Sandbox Code Playgroud)

我想搜索其中一个'PAYABLE_INVOICE_LINES'元素包含'value'大于 1000.00 的所有文档。

我的查询是

select *
from documents d
cross join lateral jsonb_array_elements(d.data_block -> 'PAYABLE_INVOICE_LINES') as pil 
where (pil->'AMOUNT'->>'value')::decimal > 1000
Run Code Online (Sandbox Code Playgroud)

但是,由于我想限制为 50 个文档,因此我必须对document_id …

postgresql performance index-tuning json postgresql-10 postgresql-performance

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