在Microsoft SQL Server中,可以指定"重音不敏感"排序规则(对于数据库,表或列),这意味着可以进行类似的查询
SELECT * FROM users WHERE name LIKE 'João'
Run Code Online (Sandbox Code Playgroud)
找到一个带有Joao
名字的行.
我知道可以使用unaccent_string contrib函数从PostgreSQL中删除字符串中的重音符号,但我想知道PostgreSQL是否支持这些"重音不敏感"排序规则,以便SELECT
上述方法可行.
以下两个查询组件的性能如何比较?
更喜欢
... 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
在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 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扫描?
我有很多使用“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)