2017-11-02 10 views
0

私はsplit_partをで使用しようとしています。WHERE IN以下のようなPostgreSQLの節。ここでObjection_tPostgreSQLのWHERE句の中で

Objcodeは小さなint型と 異議1374,824,480,3287,3286%Custom objection 等であってもよいタイプである。しかし、クエリは

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 

ABJ列にnullを返しています

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

少なくともテーブル定義、サンプルデータ、および予想される出力が必要です。 –

+0

質問を編集しました。 –

+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[]を返します。列にそのようなカンマ区切りの値を格納する


本当に悪い設計上の選択です。可能であれば、データモデルを正規化する必要があります