绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
PostgreSQL 数组忽略大小写匹配
2020-02-20 19:08:34

一位兄弟的开发需求,要求不区分大小写,匹配数组内的字符串。

如下,这样的匹配。

postgres=# select 'a' = any(array['A','1']);
 ?column? 
----------
 f
(1 row)

需要将数组内的字符串转换为小写后匹配。

postgres=# select 'a' = lower( any(array['A','1']) );
ERROR:  syntax error at or near "any"
LINE 1: select 'a' = lower(any(array['A','1']));
                           ^
 
postgres=# select 'a' = any( lower(array['A','1']) );
ERROR:  function lower(text[]) does not exist
LINE 1: select 'a' = any(lower(array['A','1']));
                         ^
HINT:  No function matches the given name and argument *. You might need to add explicit type casts.

PostgreSQL中这个需求还是很好实现的,例如加操作符,或者UDF都可以。

操作符实现忽略大小写的数元素匹配

添加一个基础函数,返回忽略大小写的比较结果。

postgres=# create function test_ci_compare(text,text) returns boolean as $$
postgres$# select lower($1)=lower($2);
postgres$# $$ language sql strict immutable;
CREATE FUNCTION
 
postgres=# select test_ci_compare('a','A');
 test_ci_compare 
-----------------
 t
(1 row)

使用这个函数创建操作符,这个操作符就是忽略大小写的了。

postgres=# create operator ~= (procedure = test_ci_compare(text,text) , LEFTARG='text', rightarg='text');
CREATE OPERATOR

原来的SQL改写成如下,使用新的操作符即可

postgres=# select 'a' ~= any(array['A','1']);
 ?column? 
----------
 t
(1 row)

这种方法可能不适用于索引扫描,除非你连索引OPAM也一起添加好。

UDF组进转换的方式

新增一个UDF,将数组内的元素转换为小写。

postgres=# create or replace function lower(text[]) returns text[] as $$
select array_agg(lower(x)) from unnest($1) t(x);
$$ language sql strict immutable;
CREATE FUNCTION
 
postgres=# select lower(array['A','a']);
 lower 
-------
 {a,a}
(1 row)

这样,就可以愉快的使用忽略大小写的匹配了,还可以继续使用索引。

postgres=# select 'a' = any( lower(array['A','1']) );
 ?column? 
----------
 t
(1 row)

一个简单的CASE,希望可以帮助到你。



分享好友

分享这个小栈给你的朋友们,一起进步吧。

PostgreSQL中文社区小栈
创建时间:2019-04-19 17:47:49
PostgreSQL中文社区是一个非盈利的民间组织,已经在中国成功举办过8届技术大会。目前成员都以志愿者身份加入,成立的目的在于构建PG数据库技术生态圈子(内核、用户、培训机构、厂商、服务商、软件开发商、高校形成“业务与利益双向驱动”的良性发展生态圈);帮助企业解决人才培养和企业商用数据库成本问题。社区会在各运营平台发布PG新信息和PG相关技术文章,推动PG技术在中国的发展。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • wangliyun
    栈主
  • digoal
    嘉宾
  • 飘絮絮絮丶
    嘉宾

小栈成员

查看更多
  • 栈栈
  • 喵呜
  • osdba
  • 一号管理员
戳我,来吐槽~