我有 2 个看起来像这样的表:
表一:
CREATE TEMP TABLE table_a (
Column_1 text,
ID_number int
);
INSERT INTO table_a VALUES
('foo,bar,baz', 123),
('qux,quux,quuz',456),
('corge,grault,garply',789),
('qux,bar,grault', 101);
Run Code Online (Sandbox Code Playgroud)
表 B:
CREATE TEMP TABLE table_b (
Column_1 text,
Column_2 text,
ID_number int
);
INSERT INTO table_b VALUES
('foo','baz',null),
('qux','quzz',null),
('corge','garply',null);
Run Code Online (Sandbox Code Playgroud)
我正在尝试从表 A 中的 ID_number 列复制值,其中表 B 的第 1 列和第 2 列中的值可以在表 A 的第 1 列的同一行中找到。
这是我在想的事情:
UPDATE table_b AS B
SET id_number = A.id_number
FROM table_a AS A
WHERE A.column_1 LIKE B.column_1
AND A.column_1 LIKE …Run Code Online (Sandbox Code Playgroud) postgresql full-text-search pattern-matching update postgresql-9.4
考虑一种情况,需要执行一堆本质上相同的操作,唯一的变量是某个对象的名称。
在我的情况下,我需要删除一些模式,所有的形式ceu_shard_test_merge_*,以使用 shell globbing 术语。所以,从概念上讲,这可以写成
DROP SCHEMA ceu_shard_test_merge_* CASCADE;
Run Code Online (Sandbox Code Playgroud)
以类比 Unix shell。
当然这个命令不起作用,那么如何用一个命令来做到这一点呢?我的理解是,这不能以可移植的方式完成。我使用的是 PostgreSQL 8.4,但用于更新 PG 版本的方法也很好。
如果解决方案有一个试运行或虚拟选项,那就太好了,这样人们就可以在实际运行之前看到将要运行哪些命令。也许只是打印命令的一种方法?
此外,指示如何处理比给出的示例更通用的模式会很好。
我想要 PostgreSQL 数据库中表中的一列(我使用的是 9.6 版)。我知道UTF8_UNICODE_CIMySQL上的排序规则,所以我尝试了:
CREATE TABLE thing (
id BIGINT PRIMARY KEY
,name VARCHAR(120) NOT NULL COLLATE "UTF8_UNICODE_CI"
);
Run Code Online (Sandbox Code Playgroud)
但我得到:
Run Code Online (Sandbox Code Playgroud)ERROR: collation "UTF8_UNICODE_CI" for encoding "UTF8" does not exist
环顾四周,我发现pg_collation表格显示了排序规则,其中显示:
=# SELECT * from pg_collation;
collname | collnamespace | collowner | collencoding | collcollate | collctype
----------+---------------+-----------+--------------+-------------+-----------
default | 11 | 10 | -1 | |
C | 11 | 10 | -1 | C | C
POSIX | 11 | 10 | -1 | …Run Code Online (Sandbox Code Playgroud) postgresql collation pattern-matching encoding case-sensitive
我最近开始研究PostgreSQL,我有大约1200 万行要处理,我想在其中应用Full Text Search。我之前没有处理此类数据库的任何经验。我已尝试优化查询,但我怀疑它是否已完全优化。
现在我正在使用GIST 索引,因为我读到GIN 索引中的更新速度较慢,并且我的数据库将定期更新。
我现在只需要关注数据库的两列merchant varchar(80)和product varchar(400).
我需要使用 FTS 查找产品,并且即使商家拼写错误,我也正在尝试获取该产品。
我在大约30K行的示例数据库上运行了一些查询,以获得以下结果:
首先,我运行基本的 FTS 查询来分析结果。
explain analyze
select count(*) from products
where to_tsvector('english', product) @@ to_tsquery('hat');
Run Code Online (Sandbox Code Playgroud)Run Code Online (Sandbox Code Playgroud)Aggregate (cost=2027.27..2027.28 rows=1 width=0) (actual time=349.032..349.032 rows=1 loops=1) -> Seq Scan on products (cost=0.00..2026.90 rows=147 width=0) (actual time=43.322..348.961 rows=307 loops=1) Filter: (to_tsvector((product)::text) @@ to_tsquery('hat'::text)) Total runtime: 349.140 ms
然后我创建了 GIST 索引并运行相同的查询以查看改进。结果非常好。至少对于我来说。
create index product_gist on products …Run Code Online (Sandbox Code Playgroud)postgresql index optimization full-text-search pattern-matching
我查看了 Microsoft 的模式文档(可以在此处找到),据我所知,它并没有说明模式重复有限次数的方法。它要么是通配符(无限期地继续),要么是在一个位置查找特定字符,每个位置都是独立输入的。有没有办法输入“模式 X 重复 Y 次”?
例如,如果我想查找正好有 5 位数字的帐号,我现在拥有的是:
SELECT * FROM table WHERE account LIKE '[0-9][0-9][0-9][0-9][0-9]'
Run Code Online (Sandbox Code Playgroud)
有没有速记的方法来做到这一点?
我正在创建一个函数来找出最适合单个字符串的搜索模式。要匹配的字符串将与可能有数百种可能模式的表格进行比较,以查看它是否与其中任何一种匹配。
我现在有一个不太优雅的函数,它可以将所有模式读入内存表并遍历它们以查看每个模式是否匹配。它有效,但想到在生产环境中使用它让我感到恶心,尤其是当模式表增长到数千个模式时。
要匹配的示例字符串:'Master'
可能的模式:
结果将与模式#1 匹配。
在这个场景中,我需要能够匹配潜在的部件号、品牌和其他可能拼错的短语。我正在合并 Double Metaphone,但是当涉及到只有一个模式才能捕捉到的其他项目时,我需要知道哪些模式是匹配的。“StringToSearch”只会返回 1 个匹配的模式。
有没有人有理论或其他代码类型可以帮助我完成这个反向模式匹配过程?
sql-server pattern-matching sql-server-2016 string-manipulation
我试图在 Postgres 9.0 的 PostGIS 中填充一个视图,在这个视图中我希望它包含一个基于 2 个字符串位置的子字符串。请参阅下面的我的代码。
CREATE OR REPLACE VIEW vw_actions AS
SELECT ls.f_table_schema, ls.f_table_name,
(SELECT substr(ls.attribute_actions_text,
strpos(ls.attribute_actions_text, 'name="')+6,
strpos(ls.attribute_actions_text, '"/>') -
strpos(ls.attribute_actions_text, 'name="'))) AS actions
FROM layer_styles ls;
Run Code Online (Sandbox Code Playgroud)
结果是它在使用 strpos 时不喜欢负数。我可以让它前进 6 个字符以从返回的子字符串中删除 'name="' 但不能删除 '"/>'。
它返回以下内容:
View SHED Database"/>
Run Code Online (Sandbox Code Playgroud)
我希望它返回的地方:
View SHED Database
Run Code Online (Sandbox Code Playgroud)
任何建议将不胜感激。
补充:我发现如果我使用 9.1,我可以使用 strposrev 并且我认为以下代码会起作用:
CREATE OR REPLACE VIEW vw_actions AS
SELECT ls.f_table_schema, ls.f_table_name,
(SELECT substr(ls.attribute_actions_text::text,
strpos(ls.attribute_actions_text::text, 'name="'::text)+6,
strposrev(ls.attribute_actions_text::text, '"/>'::text)+3 -
strpos(ls.attribute_actions_text::text, 'name="'::text))) AS actions
FROM layer_styles ls;
Run Code Online (Sandbox Code Playgroud) 默认情况下,在 PostgreSQL 中,regexp_replace()替换字符串中第一次出现的子字符串,同时replace()替换字符串中所有出现的子字符串。为什么默认行为不同?
(我知道regexp_replace可以使用该g选项替换字符串中所有出现的子字符串。)
例子:
SELECT regexp_replace('hello world', 'o', 'z'); -- returns "hellz world"
SELECT regexp_replace('hello world', 'o', 'z', 'g'); -- returns "hellz wzrld"
SELECT replace('hello world', 'o', 'z'); -- returns: "hellz wzrld"
Run Code Online (Sandbox Code Playgroud) 我想尝试正则表达式匹配,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
我正在使用 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 的相似性匹配返回。我是否需要转义“$”或类似的内容?
pattern-matching ×10
postgresql ×8
regex ×2
sql-server ×2
catalogs ×1
collation ×1
dynamic-sql ×1
encoding ×1
functions ×1
index ×1
like ×1
optimization ×1
replace ×1
update ×1
view ×1