相关疑难解决方法(0)

在两列中查找可能的重复项,忽略大小写和特殊字符

询问

SELECT COUNT(*), name, number
FROM   tbl
GROUP  BY name, number
HAVING COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)

它有时无法在小写和大写之间找到重复.
例如:sunny并且Sunny不会显示为重复项.
那么如何在PostgreSQL中为两列找到所有可能的重复项.

sql postgresql case-insensitive duplicates pattern-matching

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

postgres功能:IMMUTABLE什么时候会伤害性能?

Postgres的文档

为了获得最佳的优化结果,您应该使用对其有效的最严格的波动率类别标记您的函数.

但是,我似乎有一个例子,并非如此,我想了解发生了什么.(背景:我正在运行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)

postgresql performance user-defined-functions

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

SQL查询,用于将值列表与任何顺序的字段列表进行匹配,而不重复

我最近不得不编写一个查询来过滤一些如下所示的特定数据:

假设我有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)

mysql sql postgresql permutation mariadb

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

索引数组以进行全文搜索

我正在尝试索引可在其标记数组上搜索的文档.

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不可变函数,但我觉得我喜欢玩火,因为我不知道我在做什么.有什么办法不重新实施吗?

看起来我可以重新打包相同的功能并将其标记为不可变,但看起来这样做有风险.

如何索引数组以进行全文搜索?

postgresql indexing full-text-search

6
推荐指数
2
解决办法
2037
查看次数

折叠案例以加快比较

"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 发送文本以折叠案例。但必须有比这更好的方法。

c# case-folding

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

PostgreSQL 不区分大小写和不区分重音的搜索

我有一个数据表,我想过滤列。例如,按用户的全名搜索用户。

\n

但是,我希望允许用户输入搜索短语时不区分大小写和重音。

\n

所以我检查了这些(以及更多)来源和问题:

\n\n

我认为非确定性排序规则可能最终是实现这一目标的正确方法,但不幸的是我不知道如何:

\n
    \n
  • 将 case_insensitive 和ignore_accents 合并为一种排序规则
  • \n
  • 如何允许仅通过此类 WHERE 中的子字符串进行搜索(例如,仅通过字符串“joh”查找“J\xc3\xb3hn Doe”),因为非确定性排序规则不支持 LIKE 或正则表达式
  • \n
  • 使用哪个索引
  • \n
\n

对于如何最终处理此类问题的任何建议,我将非常感激。

\n

谢谢!

\n

postgresql indexing search

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

在PostgreSQL上从JSON创建时间戳索引

我有一个名为场PostgreSQL的表datajsonb有大量的对象,我想打一个索引,以加快查询.我使用几行来测试数据(只有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 jsonb

4
推荐指数
1
解决办法
2207
查看次数

为什么搜索词的细微变化会使查询变慢?

我在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

4
推荐指数
1
解决办法
218
查看次数

PostgreSQL重音+不区分大小写的搜索

我正在寻找一种支持良好性能不区分大小写+重音不敏感搜索的方法.到目前为止,我们使用MSSql服务器没有问题,我们必须使用Oracle OracleText,现在我们需要在PostgreSQL上使用它.

我发现这篇关于重音不敏感的帖子:
PostgreSQL是否支持"重音不敏感"排序?

但我们需要将它与不区分大小写结合起来.我们还需要使用索引,否则可能会影响性能.有关大型数据库最佳方法的真实经验吗?

postgresql indexing database-design full-text-search case-insensitive

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

unaccent()阻止Postgres中的索引使用

我想从导入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扫描?

sql postgresql indexing unaccent openstreetmap

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

Spring Data JPA - 转义重音法语字符 (é, à, è, û..)

我使用 Spring Data JPA 方法名称查询来执行 SQL 查询,例如findByNameContains(String name)查找名称包含给定字符串的所有实体。但它仅适用于确切的字符。我想知道如果用户输入\xc3\xa9,如何返回名称包含字符\xc3\xa9及其基本字符的所有实体e。谢谢。

\n

java postgresql spring-data-jpa

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