相关疑难解决方法(0)

PostgreSQL是否支持"不区分重音"排序规则?

在Microsoft SQL Server中,可以指定"重音不敏感"排序规则(对于数据库,表或列),这意味着可以进行类似的查询

SELECT * FROM users WHERE name LIKE 'João'
Run Code Online (Sandbox Code Playgroud)

找到一个带有Joao名字的行.

我知道可以使用unaccent_string contrib函数从PostgreSQL中删除字符串中的重音符号,但我想知道PostgreSQL是否支持这些"重音不敏感"排序规则,以便SELECT上述方法可行.

sql postgresql indexing localization pattern-matching

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

更喜欢vs iLIKE

以下两个查询组件的性能如何比较?

更喜欢

... LOWER(description) LIKE '%abcde%' ...
Run Code Online (Sandbox Code Playgroud)

我喜欢

... description iLIKE '%abcde%' ...
Run Code Online (Sandbox Code Playgroud)

postgresql performance pattern-matching database-performance

32
推荐指数
2
解决办法
5万
查看次数

可延迟,不区分大小写的唯一约束

在PostgreSQL中是否可以在字符列上创建可延迟的唯一约束,但不区分大小写?

我们假设以下基本表:

CREATE TABLE sample_table ( 
   my_column VARCHAR(100)
);
Run Code Online (Sandbox Code Playgroud)

如果不需要可延迟约束,那么就像使用函数创建唯一索引一样简单,例如:

CREATE UNIQUE INDEX my_unique_index ON sample_table(UPPER(my_column));
Run Code Online (Sandbox Code Playgroud)

延迟约束检查需要显式创建约束,例如:

ALTER TABLE sample_table 
 ADD CONSTRAINT my_unique_constraint UNIQUE(my_column)
 DEFERRABLE INITIALLY IMMEDIATE;
Run Code Online (Sandbox Code Playgroud)

遗憾的是,不可能在唯一约束中使用任意函数.

一种可能的解决方法是创建具有相同内容的附加列my_column,但是大写,在每次更新/插入后通过触发器更新,然后在此人工列上创建可延迟的唯一约束.然而,这听起来像是一个非常丑陋的黑客.

或者,应该可以使用CREATE CONSTRAINT TRIGGER并手动检查不区分大小写的唯一性(当然,仍然需要常规索引).对于如此简单(以及流行的,我认为)的要求,这听起来有点过于复杂.

围绕这个限制是否有更简单和/或更优雅的方式?

postgresql constraints database-indexes

15
推荐指数
1
解决办法
4456
查看次数

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
查看次数

如何关闭postgresql区分大小写的搜索?

我有很多使用“WHERE”子句的 sql 查询命令,我只是想知道我的 postgresql 搜索是否区分大小写。

例如:

 Select * From myarea Where area_name = 'Jawa Barat1' --> not found
 Select * from myarea Where area_name = 'jawa barat1' --> found
Run Code Online (Sandbox Code Playgroud)

如何关闭 postgresql 中区分大小写的搜索?

请不要建议我将sql命令更改为将两侧设置为小写。

期望 postgresql 区分大小写搜索(Mother = mother)

postgresql case-sensitive

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