SELECT COUNT(*), name, number
FROM tbl
GROUP BY name, number
HAVING COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)
它有时无法在小写和大写之间找到重复.
例如:sunny并且Sunny不会显示为重复项.
那么如何在PostgreSQL中为两列找到所有可能的重复项.
为了获得最佳的优化结果,您应该使用对其有效的最严格的波动率类别标记您的函数.
但是,我似乎有一个例子,并非如此,我想了解发生了什么.(背景:我正在运行postgres 9.2)
我经常需要将表示为整数秒的时间转换为日期.我写了一个函数来做到这一点:
CREATE OR REPLACE FUNCTION
to_datestamp(time_int double precision) RETURNS date AS $$
SELECT date_trunc('day', to_timestamp($1))::date;
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
让我们将性能与其他相同的函数进行比较,将波动率设置为IMMUTABLE和STABLE:
CREATE OR REPLACE FUNCTION
to_datestamp_immutable(time_int double precision) RETURNS date AS $$
SELECT date_trunc('day', to_timestamp($1))::date;
$$ LANGUAGE SQL IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)
CREATE OR REPLACE FUNCTION
to_datestamp_stable(time_int double precision) RETURNS date AS $$
SELECT date_trunc('day', to_timestamp($1))::date;
$$ LANGUAGE SQL STABLE;
Run Code Online (Sandbox Code Playgroud)
为了测试这个,我将创建一个10 ^ 6个随机整数的表,对应于2010-01-01和2015-01-01之间的时间
CREATE TEMPORARY TABLE random_times AS
SELECT 1262304000 + round(random() * 157766400) AS time_int
FROM generate_series(1, 1000000) …Run Code Online (Sandbox Code Playgroud) 我最近不得不编写一个查询来过滤一些如下所示的特定数据:
假设我有3个不同的值,我想在我的数据库中的一个表的3个不同字段中搜索,它们必须以所有可能的顺序搜索而不重复.
下面是一个示例(为了便于理解,我将使用命名查询表示法来显示必须放置值的位置):
val1 ="a",val2 ="b",val3 ="c"
这是我生成的查询:
SELECT * FROM table WHERE
(fieldA = :val1 AND fieldB = :val2 AND fieldC = :val3) OR
(fieldA = :val1 AND fieldB = :val3 AND fieldC = :val2) OR
(fieldA = :val2 AND fieldB = :val1 AND fieldC = :val3) OR
(fieldA = :val2 AND fieldB = :val3 AND fieldC = :val1) OR
(fieldA = :val3 AND fieldB = :val1 AND fieldC = :val2) OR
(fieldA = :val3 AND fieldB = :val2 …Run Code Online (Sandbox Code Playgroud) 我正在尝试索引可在其标记数组上搜索的文档.
CREATE INDEX doc_search_idx ON documents
USING gin(
to_tsvector('english', array_to_string(tags, ' ')) ||
to_tsvector('english', coalesce(notes, '')))
)
Run Code Online (Sandbox Code Playgroud)
哪里tags是(ci)text[].但是,PG会拒绝索引,array_to_string因为它并不总是不可变的.
PG::InvalidObjectDefinition: ERROR: functions in index expression must be marked IMMUTABLE
Run Code Online (Sandbox Code Playgroud)
我已经尝试创建一个自制的array_to_string不可变函数,但我觉得我喜欢玩火,因为我不知道我在做什么.有什么办法不重新实施吗?
看起来我可以重新打包相同的功能并将其标记为不可变,但看起来这样做有风险.
如何索引数组以进行全文搜索?
"strasse".Equals("STRAße",StringComparison.InvariantCultureIgnoreCase)
Run Code Online (Sandbox Code Playgroud)
这返回真。哪个是正确的。不幸的是,当我将其中一个存储在 postgres 中时,它认为在进行不区分大小写的匹配(例如, with ~*)时它们不一样。我也用 citext 测试过。
因此,一种解决方案是预先折叠案例,从而将strasse这些值中的任何一个存储在另一列中。然后我可以索引并搜索匹配项。
我一直在寻找如何在 C# 中折叠 case 一段时间,但一直无法在 C# 中找到解决方案。显然,知识是存在的,因为它可以正确比较这些字符串,我只是找不到从哪里获取它。
一种解决方案是生成一个 perl 进程perl -E "binmode STDOUT, ':utf8'; binmode STDIN, ':utf8'; while (<>) { print fc }",将进程的 C# 端也设置为这些管道的 utf8,然后通过 perl 发送文本以折叠案例。但必须有比这更好的方法。
我有一个数据表,我想过滤列。例如,按用户的全名搜索用户。
\n但是,我希望允许用户输入搜索短语时不区分大小写和重音。
\n所以我检查了这些(以及更多)来源和问题:
\n我认为非确定性排序规则可能最终是实现这一目标的正确方法,但不幸的是我不知道如何:
\n对于如何最终处理此类问题的任何建议,我将非常感激。
\n谢谢!
\n我有一个名为场PostgreSQL的表data是jsonb有大量的对象,我想打一个索引,以加快查询.我使用几行来测试数据(只有15行),但我不希望将来出现查询问题.我从Twitter API获取数据,因此在一周内我获得了大约10GB的数据.
如果我做正常索引
CREATE INDEX ON tweet((data->>'created_at'));
我得到一个文本索引,如果我做:
Create index on tweet((CAST(data->>'created_at' AS timestamp)));
我明白了
ERROR: functions in index expression must be marked IMMUTABLE
我试图让它"无意识"设置时区
date_trunc('seconds', CAST(data->>'created_at' AS timestamp) at time zone 'GMT')
但我仍然得到"不可变"的错误.那么,我如何从JSON中完成时间戳索引?我知道我可以用日期创建一个简单的专栏,因为它可能在时间上保持不变,但我想学习如何做到这一点.
我在PostgreSQL(9.5.1)中有以下查询:
select e.id, (select count(id) from imgitem ii where ii.tabid = e.id and ii.tab = 'esp') as imgs,
e.ano, e.mes, e.dia, cast(cast(e.ano as varchar(4))||'-'||right('0'||cast(e.mes as varchar(2)),2)||'-'|| right('0'||cast(e.dia as varchar(2)),2) as varchar(10)) as data,
pl.pltag, e.inpa, e.det, d.ano anodet, coalesce(p.abrev,'')||' ('||coalesce(p.prenome,'')||')' determinador, d.tax, coalesce(v.val,v.valf)||' '||vu.unit as altura,
coalesce(v1.val,v1.valf)||' '||vu1.unit as DAP, d.fam, tf.nome família, d.gen, tg.nome gênero, d.sp, ts.nome espécie, d.inf, e.loc, l.nome localidade, e.lat, e.lon
from esp e
left join det d on e.det = d.id
left join tax tf …Run Code Online (Sandbox Code Playgroud) postgresql performance pattern-matching query-performance postgresql-performance
我正在寻找一种支持良好性能不区分大小写+重音不敏感搜索的方法.到目前为止,我们使用MSSql服务器没有问题,我们必须使用Oracle OracleText,现在我们需要在PostgreSQL上使用它.
我发现这篇关于重音不敏感的帖子:
PostgreSQL是否支持"重音不敏感"排序?
但我们需要将它与不区分大小写结合起来.我们还需要使用索引,否则可能会影响性能.有关大型数据库最佳方法的真实经验吗?
postgresql indexing database-design full-text-search case-insensitive
我想从导入PostgreSQL 9.3.5的OpenStreetMap数据库中检索具有给定名称的方法,操作系统是Win7 64位.为了有点容错,我使用了Postgres的unaccent扩展.
我的查询如下:
SELECT * FROM germany.ways
WHERE lower(tags->'name') like lower(unaccent('unaccent','Weststrasse'))
Run Code Online (Sandbox Code Playgroud)
查询计划:
Seq Scan on ways (cost=0.00..2958579.31 rows=122 width=465)
Filter: (lower((tags -> 'name'::text)) ~~ lower(unaccent('unaccent'::regdictionary, 'Weststrasse'::text)))
Run Code Online (Sandbox Code Playgroud)
奇怪的是,此查询使用顺序扫描方式,尽管索引存在于lower(tags->'name'):
CREATE INDEX ways_tags_name ON germany.ways (lower(tags -> 'name'));
Run Code Online (Sandbox Code Playgroud)
一旦我从查询中删除unaccent,Postgres就会使用索引:
SELECT * FROM germany.ways
WHERE lower(tags->'name') like lower('Weststrasse')
Run Code Online (Sandbox Code Playgroud)
查询计划:
Index Scan using ways_tags_name on ways (cost=0.57..495.43 rows=122 width=465)
Index Cond: (lower((tags -> 'name'::text)) = 'weststrasse'::text)
Filter: (lower((tags -> 'name'::text)) ~~ 'weststrasse'::text)
Run Code Online (Sandbox Code Playgroud)
为什么无法防止Postgres使用索引?在我看来,这没有意义,因为在执行实际查询之前,应该已经完全知道unaccent(变音符号删除等)的结果.所以Postgres应该能够使用索引.使用unaccent时如何避免seq扫描?
我使用 Spring Data JPA 方法名称查询来执行 SQL 查询,例如findByNameContains(String name)查找名称包含给定字符串的所有实体。但它仅适用于确切的字符。我想知道如果用户输入\xc3\xa9,如何返回名称包含字符\xc3\xa9及其基本字符的所有实体e。谢谢。
postgresql ×10
indexing ×4
sql ×3
performance ×2
c# ×1
case-folding ×1
duplicates ×1
java ×1
jsonb ×1
mariadb ×1
mysql ×1
permutation ×1
search ×1
unaccent ×1