Python操作PostgreSQL:查询数组字段含指定元素的对应name值
PostgreSQL数组字段匹配指定元素的正确查询方式
问题场景
用Python操作PostgreSQL,products表包含name和subname字段,其中subname为数组类型,部分数据示例如下:
('Green Sq Choli', ['Green_Mehndi', 'Green_rasam M', 'Green_mahendi-2']) ('sakkarpara', ['yellow flaird', 'yellow embroidery sharara', 'yelo ZC', 'yellow flaird FBA', 'Sakkarpara Free']) ('MLT-RED', ['mlt-red']) ('MLT-PNK-BLK', ['mlt-pnk-blk']) ('gown bhuri', ['Akansha XXL']) ('Red SQBlouse', ['r m blouse', 'red seqin', 'rh blouse', 'red blouse', 'Red satari']) ('Bhuri net', ['bhoori PPL', 'bhoorki', 'bhuri shrrara', 'Bhoori XL', 'Purple sharara bhuri', 'Bhuri PPL', 'Bhurii', 'Bhoorii shraraa']) ('Spara-XL', ['skkarpara-XL', 'YLW zc XL', 'Daya XL\t', 'Daya XL', 's-para-XL']) ('GHERA-M', ['\tGhera-M', 'Ghera-M', 'GHERA-M', 'ghera M']) ('Perali-XXL', ['peralisis-XXL']) ('Kinjal-xxl', ['kinjal -XXL'])
需要取出subname数组中包含red seqin的记录对应的name值,但之前使用的subname[0:-1]="red seqin"写法无效,求正确实现方式。
正确实现方式
PostgreSQL针对数组类型提供了多种内置操作,以下几种写法都能解决问题:
1. 使用数组包含操作符 @>
这是最直观简洁的写法,直接判断数组是否包含目标元素:
SELECT name FROM products WHERE subname @> ARRAY['red seqin'];
2. 使用 ANY() 函数
通过ANY()函数检查目标值是否匹配数组中的任意元素:
SELECT name FROM products WHERE 'red seqin' = ANY(subname);
3. 使用 array_position() 函数
如果需要同时确认元素的位置(或仅判断存在性),可以用这个函数——元素存在时返回其索引,不存在则返回NULL:
SELECT name FROM products WHERE array_position(subname, 'red seqin') IS NOT NULL;
原写法无效的原因
subname[0:-1]的作用是截取数组的子数组(从第一个元素到倒数第二个元素),属于数组切片操作,而非检查元素是否存在的逻辑,因此无法得到正确结果。
内容的提问来源于stack exchange,提问作者jinal savaliya
相关产品推荐
相关产品推荐

