質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

3回答

7558閲覧

カンマ区切り文字列が入った列を配列化し、その配列化した任意の値でUPDATEする方法

ginnnosuke

総合スコア10

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2016/11/09 08:27

編集2016/11/10 01:16

タイトルがまとまっておらず申し訳ございません。
稚拙な文ですがご回答いただけないでしょうか。

下記のことを行いたいと思っております。

■対象レコード例
※col_A、col_B、col_Cは全てtext型
※col_Bは必ずカンマ区切りで2つの数字が入る

RECORD 1

カラム名
col_A1
col_B3,4
col_C(NULL)

RECORD 2

カラム名
col_A2
col_B7,8
col_C(NULL)

■行いたいこと
javaやphp等をかまさずに、SQL文一発で実行できればと思います。

col_Aが「奇数」であるとき、col_Bをカンマ区切りで配列化し、
配列化した「1列目」をcol_CへUPDATEする。

col_Aが「偶数」であるとき、col_Bをカンマ区切りで配列化し、
配列化した「2列目」をcol_Cへ代入する。

■対象レコード例に対して本件適用後の結果
RECORD 1

カラム名
col_A1
col_B3,4
col_C3

RECORD 2

カラム名
col_A2
col_B7,8
col_C8

要件がわかりにくいようでしたら、お手数ですがコメントいただけないでしょうか。
以上、宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kunai

2016/11/09 08:36

SQL一文でやりたいという事ですか?JavaなりPHPなりかませてそちらで処理する事を想定されていますか?
ginnnosuke

2016/11/10 01:18

ご指摘いただきありがとうございます。情報を明記しておりませんでした。java等はかませない前提だっため修正致しました。
guest

回答3

0

ベストアンサー

col_Cはintとしましたcharであればcastは不要です。

sql

1update table set col_c = split_part(col_b,',',case col_a%2 when 1 then 1 else 2 end)::numeric;

投稿2016/11/09 08:46

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ginnnosuke

2016/11/10 04:24

ご回答ありがとうございます! 内容を踏まえてSQL内の値、選定部分を下記のようにしたところ要件動作を確認致しました。 split_part(col_B,',',case CAST(col_A AS integer)%2 when 1 then 1 else 2 end)::numeric 今後とも宜しくお願い致します。
A.Ichi

2016/11/10 04:27

col_Aはintと勘違いしてました。上記で良いと思います。
ginnnosuke

2016/11/10 04:30

こちらこそ質問概要が稚拙でご迷惑をお掛け致しました; 非常にわかりやすい回答で理解できました。 有難うございました。
guest

0

数値と文字列の区別が、うまく出来ていないような気がしますので、少し問題を整理しましょう。

まず、全てのカラムがtext型がレコードというのは、正しいとします。
※col_A、col_B、col_Cは全てtext型

そうすると、
※col_Bは必ずカンマ区切りで2つの数字が入る
は、
col_Bのデータは、1つ以上の数文字、1つのカンマ、1つ以上の数文字 を並べたものになる
と表現したほうが良いと思います。

col_Cに入れるのも文字列ですから、
「col_Bの文字列データから2つの数値に変換し、それらを配列に入れ、その1項目目を取り出し、それを文字列に変換してcol_Cに入れるデータにする」
よりも
「col_Bの文字列データから、カンマの左側の文字列を取り出して、col_Cに入れるデータにする」
ほうが簡単だからです。

2項目目を取り出すなら、カンマの右側の文字列を取り出せば良いですよね。
strpos関数でカンマが何文字目にあるかを調べ、substr関数でカンマの右や左の文字列を取り出せます。

書き忘れてましたが、col_Aのデータは、to_number関数で数値に変換し、剰余の演算子(%)を使って奇数か偶数かを調べます。 a % 2 = 0 が成立すれば、aは偶数という事になります。

投稿2016/11/09 09:01

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ginnnosuke

2016/11/10 01:19

ご推察の通りの内容です。ご指摘いただきありがとうございます。 整理していただいた内容と、他の回答者様の内容を踏まえてSQL文を作成しようと思います!
guest

0

SQL上での分解が、
・カラムBをカンマで分解する。このときの添え字は、
・カラムAを
・数値化し、
・2で割ったあまりを求める。
・結果が0か1なので、更に1を加算してsplit結果のインデックス値(1か2)にあわせる

で、split文を作成してみました。
split_part(col_B,',', (to_number(col_A, '9') % 2) + 1)

これをアップデート文に加工すると、
update 対象テーブル set col_C = split_part(col_B,',', (to_number(col_A, '9') % 2) + 1)

といったところでしょうか。
※ 当方postgresの環境がないため、未デバッグです。

投稿2016/11/09 08:49

akio221

総合スコア716

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ginnnosuke

2016/11/10 04:23

ご回答ありがとうございます! A.Ichi様の回答も併せてSQL内の値、選定部分を下記のようにしたところ要件動作を確認致しました。 split_part(col_B,',',case CAST(col_A AS integer)%2 when 1 then 1 else 2 end)::numeric ご丁寧な解説ありがとうございました。 今後とも宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問