我必须编写一个简单的查询,在其中查找以 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
我想针对jsonb
Postgres中的类型编写一个查询,给定一组客户 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"
谁能解释一下 LIKE 运算符是如何在当前数据库系统(例如 MySQL 或 Postgres)中实现的?或者指出一些解释它的参考资料?
天真的方法是检查每条记录,在感兴趣的字段上执行正则表达式或部分字符串匹配,但我有一种感觉(希望)这些系统做一些更聪明的事情。
mysql postgresql performance full-text-search pattern-matching
我正在努力提高我的词汇量,以便更好地与我的开发人员交流。我们在站点中有几个地方正在讨论是否应该从头开始搜索字符串,还是应该在字符串中的'running%'
任何位置搜索'%running%
。
我一直将中间搜索称为“模糊”,我意识到这是不正确的,因为模糊意味着改变单词“run”、“runing”[原文如此]、“runed”[原文如此]的形式。
搜索字符串开头和搜索字符串中间的正确术语是什么?
我有一个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)
问题是我需要通过变量值来查询它,例如:
所有在偏好上有“汉堡包”的人,部分查询也必须是可能的,所以搜索“burg”必须给我带来记录2。
使用json函数,我可以搜索值,只要我知道key,对吗?或者有一种快速搜索值的方法?
我想做的是创建一个 tsvector 列并转储 json 以使用全文搜索来执行部分查询。
这是表定义(简化):
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
postgresql ×5
json ×3
performance ×2
array ×1
index ×1
index-tuning ×1
mysql ×1
regex ×1
terminology ×1