PostgreSQL 数组忽略大小写匹配

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介:

PostgreSQL 数组忽略大小写匹配

作者

digoal

日期

2016-11-19

标签

PostgreSQL , 开发 , 数组 , any匹配 , 忽略大小写


背景

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

如下,这样的匹配。

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 types. 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,希望可以帮助到你。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
SQL 关系型数据库 PostgreSQL
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 数组类型
PostgreSQL 数组类型
149 0
|
搜索推荐 关系型数据库 PostgreSQL
postgresql 标签分组实战(可用于用户画像的实践)-数组篇
基于数组方式方面的基础应用,如有更大数据量的标签组合的时候,请参考下德哥写的文章 https://developer.aliyun.com/article/307731
309 0
|
SQL 关系型数据库 PostgreSQL
postgresql模糊查询不区分大小写
本人当时找了无数文章都没解决,后面才发现pg有ilike这个关键字,书读少了好吃亏的(小声逼逼) 除此之外还可以通过upper()函数来搞
482 0
|
关系型数据库 PostgreSQL
|
SQL 存储 关系型数据库
PostgreSQL 设计优化case - 多对多 转 一对多(数组)
标签 PostgreSQL , 数组 , 多对多 , 一对多 , udf , JOIN 背景 某个系统存储了会员的标签,以及标签的描述信息。业务上需要通过会员ID得到会员的标签,再得到描述信息。 每个会员有若干标签,原来是这么存储的 1、会员标签表,人数5亿左右,每个人平均有几百个标签,1500亿行左右。
2216 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.23. 行和数组比较
9.23. 行和数组比较 9.23.1. IN 9.23.2. NOT IN 9.23.3. ANY/SOME (array) 9.23.4. ALL (array) 9.23.5. 行构造器比较 9.23.6. 组合类型比较 本节描述几个特殊的结构,用于在值的组之间进行多重比较。
1345 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.18. 数组函数和操作符
9.18. 数组函数和操作符 表 9.48显示了可以用于数组类型的操作符。 表 9.48. 数组操作符 操作符 描述 例子 结果 = 等于 ARRAY[1.1,2.1,3.
1222 0

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版