
PostgreSQLの配列に対して、要素の追加及び削除を行いたいのですが、下記のような動作をさせるには、※1と※2で、どのようなSQLを実行すれば良いでしょうか?
よろしくお願いいたします。
>>>
CREATE TABLE test (
id integer,
data integer[]
);
INSERT INTO test VALUES (1, '{0,1,2,3,4}');
INSERT INTO test VALUES (2, '{5,6,7,8,9}');
SELECT * FROM test;
id | data
----+-------------
1 | {0,1,2,3,4}
2 | {5,6,7,8,9}
(2 rows)
UPDATE test [data配列に10を追加] WHERE id = 1; /* ※1 */
UPDATE test [data配列から6を除去] WHERE id = 2; /* ※2 */
SELECT * FROM test;
id | data
----+-------------
1 | {0,1,2,3,4,10}
2 | {5,7,8,9}
(2 rows)
<<<
No.1ベストアンサー
- 回答日時:
PostgreSQL での配列は使ったことが無いのでちょっと調べてみました。
配列要素の追加は下記のように出来るようです。
UPDATE test SET data = array_append(data, 10);
UPDATE test SET data = data || ARRAY[10]
しかし, マニュアルに配列要素の削除についての項目が見当たりませんでした・・・。
結構検索してみたのですがどうにも見つけられず, 配列関数としてもサポートされていないようですし, もしかしたら無いのかも? ^^;
# data - ARRAY[6] とかやってもだめでした。
参考URL:http://sirius.itfrontier.co.jp/Powergres/product …
array_appendという関数があったのですね。気づきませんでした。ありがとうございます^^
除去の方は、やはり関数も無いようなので、CREATE FUNCTION に初挑戦してみました。
>>>
CREATE FUNCTION array_strip(integer[], integer) RETURNS integer[] AS '
DECLARE
src ALIAS FOR $1;
val ALIAS FOR $2;
dst integer[] := ''{}'';
i integer;
BEGIN
FOR i IN array_lower(src,1) .. array_upper(src,1) LOOP
IF src[i] != val THEN
dst := array_append(dst, src[i]);
END IF;
END LOOP;
RETURN dst;
END;
' LANGUAGE 'plpgsql';
UPDATE test SET data = array_append(data, 10) WHERE id = 1;
UPDATE test SET data = array_strip(data, 6) WHERE id = 2;
<<<
以上のようになりましたが、もっと効率の良い方法、ありますかね…。
No.2
- 回答日時:
配列の要素を操作する関数が限られている以上, 配列の要素を全部サーチする以外に方法はないかと思います。
配列要素がそれなりに大きくなると負荷もあがりそうですし, 関数やプロシージャはデバッグが大変です ^^;
DB側ではなくフロント側で配列を操作するか, 配列データを正規化して別テーブルに分けるかにしたほうがいいかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- Visual Basic(VBA) Selenium Basicの件 5 2023/04/10 20:55
- PHP php エラー 2 2022/10/23 16:43
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- ドライブ・ストレージ HDDのチェック方法 6 2022/05/04 09:49
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- MySQL UPDATE my_items SET item_name '赤い,甘い,ケーキ' WHERE id 1 2023/01/03 09:52
- HTML・CSS ブロックエディターで作りつつ、画像を挿入しつつ、画像にスタイルシートのコードを付ける方法はありますか 1 2022/08/23 18:46
- PHP PHP MySQLに画像を直接保存 2 2022/06/05 11:50
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
pgAdminIII RAISEの結果取得に...
-
SELECT文で足し算をした場合、N...
-
集まり単位?でのソート
-
SQLSERVER 連番更新について
-
【SQL】他テーブルに含まれる値...
-
貸家のデータベース
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
sqlに記述できない文字
-
データの入れ替えを同時に行な...
-
SELCTを使って違うテーブルのデ...
-
SQLで一定時間周期毎の抽出方法...
-
SQLで、Join句で結合したテ...
-
mdf&ldfファイルからフラット...
-
Java環境で使用するAccessデー...
-
固定長のデータをmysqlで取り込...
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
-
PostgreSQLのtimestamp型で時間...
-
AccessVBAについて テーブルの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CSVファイルを読み込んでテーブ...
-
SQLSERVER 連番更新について
-
timestamp が空のデータを除い...
-
テキストボックスの背景をVB...
-
エクセルVBA 10分後にエクセル...
-
SELECT文で足し算をした場合、N...
-
ACCESS テキストボックスに入...
-
データがリストアできない!!
-
AVR studio6でeepromリードでき...
-
Japanese schools
-
Accessエクスポート時に連番を...
-
型について
-
PreparedStatementでの複数検索
-
時間の比較をしたい
-
配列データに対する、要素の追...
-
PostgreSQL serial型の質問
-
SQL SERVERの BULK INSERT
-
POSTGRESQLデフォルトのシーケ...
-
(Linux、データベース初心者)...
-
【SQL】他テーブルに含まれる値...
おすすめ情報