PostgreSQL WHERE IN子句

PostgreSQL WHERE IN子句,postgresql,Postgresql,我试图在PostgreSql的子句中使用split_part,如下所示。这里,Objcode是small int类型,objective可能类似于137482448032873286%Custom objective 但是查询在abj列中返回null SELECT o.objection, TO_CHAR(o.obj_redate,'DD-MM-YYYY') AS objection_date, o.srno, (SELECT string_agg(objtype,'<br/>')

我试图在PostgreSql的子句中使用split_part,如下所示。这里,Objcode是small int类型,objective可能类似于
137482448032873286%Custom objective
但是查询在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
反对

    **objcode**                 **objtype**
         1                     objection name
         2                      vjlbhjdhbldhb
         3                      bgbrbgrbnrb

您的查询基本上会将单个字符串常量传递给
in
运算符:

WHERE objcode IN ('1374,824,480,3287,3286')
一旦从输入中删除了
%自定义异议
,则需要将单个字符串值转换为多个值。最简单的方法可能是将其转换为数组

WHERE objcode = ANY ( string_to_array(split_part(o.objection,'%',1), ',')::smallint[] )
string\u数组
返回一个
text[]
,因此需要将其转换为正确的整数数组



将逗号分隔的值存储在列中是一个非常糟糕的设计选择。如果可能,您应该规范化您的数据模型

您的查询基本上会将单个
字符串常量传递给中的操作符:

WHERE objcode IN ('1374,824,480,3287,3286')
一旦从输入中删除了
%自定义异议
,则需要将单个字符串值转换为多个值。最简单的方法可能是将其转换为数组

WHERE objcode = ANY ( string_to_array(split_part(o.objection,'%',1), ',')::smallint[] )
string\u数组
返回一个
text[]
,因此需要将其转换为正确的整数数组



将逗号分隔的值存储在列中是一个非常糟糕的设计选择。如果可能,您应该规范化数据模型

我们至少需要表定义、样本数据和预期输出。我已经编辑了我的问题,请检查将多个值存储为逗号分隔的字符串是一个非常糟糕的主意。更重要的是,如果您混合使用不同的类型,那么更谨慎的做法是更改表并添加一个新列以将该部分放入,因为您在一列中混合了两种数据类型。我们至少需要表定义、示例数据和预期输出。我已经编辑了我的问题,请检查将多个值存储为逗号分隔的字符串是一个非常糟糕的主意。更重要的是,如果您混合使用不同的类型,那么更谨慎的做法是更改表并添加一个新列以将该
%
部分放入,因为您在一列中混合了两种数据类型。