0

現在、CASE 式を使用して、他の列の属性に基づいて空の列を更新しています。例えば

UPDATE table SET cat = CASE 
WHEN term = '{"Boulder"}' then 'Boulder'

ただし、同じことをする必要がありますが、テキスト配列で、特に要素がその配列内の特定の位置にある場合に必要です。

たとえば、データが次のように見える場合

{"Boulder, Tree, Bush"}

WHEN position('Tree' in term) > 0 then 'Boulder'

しかし、エラーメッセージが表示されます

関数 pg_catalog.position(文字の変化[]、不明) は存在しません

以前に関数で位置を使用したことがあるので、この状況で PostgreSQL がそれを好まない理由がわかりません。

配列内のテキスト要素の位置を決定する際に CASE 式を使用する方法はありますか?

4

1 に答える 1

0

どうやらあなたのterm列は配列として定義されています、例えば varchar[]。このposition関数はスカラー値でのみ機能し、配列では機能しません。

要素が配列に含まれているかどうかをテストする場合は、別の演算子を使用する必要があります。@>

update foobar
   set cat = 'Boulder'
where term @> '{"Boulder"}'

この式'{"Boulder"}'は、単一の要素を持つ配列を作成します。array['Boulder']これは(私がより読みやすいと思う)と同等です。したがって、上記のwhere条件termは、配列に演算子の右側にある配列のすべての要素が含まれているすべての行を更新します。この場合、テストしているのは1つの要素だけです。

配列関数と演算子の詳細については、マニュアルを参照してください:http ://www.postgresql.org/docs/current/static/functions-array.html

要件が変更された後に編集する

ボルダーが1位、2位、または3位にあるものだけを見つけて更新するには、次を使用できます。

update foobar
   set cat = 'Boulder'
where 'Boulder' in (term[1], term[2], term[3]);
于 2012-12-03T12:17:07.523 に答える