我正在尝试在PostgreSql的 WHERE IN 子句中使用split_part,如下所示。此处 Objcode 的类型为小型int,异议可能类似于1374,824,480,3287,3286%Custom objection
但查询在abj列中返回null
SELECT o.objection,
TO_CHAR(o.obj_redate,'DD-MM-YYYY') AS objection_date, o.srno,
(SELECT string_agg(objtype,'<br/>') FROM objection_t
WHERE objcode IN (split_part(o.objection,'%',1))) as obj
FROM objection_history o
objection_history
**fil_no** **objection** **obj_date**
1 1,2,4%some custom obj 2017-01-01
2 5,6,300%nsnvnv 2017-01-02
3 5 2017-01-02
Objection_t
**objcode** **objtype**
1 objection name
2 vjlbhjdhbldhb
3 bgbrbgrbnrb
答案 0 :(得分:2)
您的查询实际上会导致将单个字符串常量传递给IN
运算符:
WHERE objcode IN ('1374,824,480,3287,3286')
从输入中删除%Custom objection
后,您需要将该单个字符串值转换为多个值。最简单的方法可能是将其转换为数组。
WHERE objcode = ANY ( string_to_array(split_part(o.objection,'%',1), ',')::smallint[] )
string_array
返回text[]
,因此您需要将其强制转换为正确的整数数组。
在列中存储逗号分隔值是真正错误的设计选择。如果可能,您应该规范化数据模型