PostgreSQL WHERE IN子句

时间:2017-11-02 07:16:35

标签: postgresql

我正在尝试在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

1 个答案:

答案 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[],因此您需要将其强制转换为正确的整数数组。

在列中存储逗号分隔值是真正错误的设计选择。如果可能,您应该规范化数据模型