- PR -

スペースを条件にしたUpdate

1
投稿者投稿内容
yurayura
会議室デビュー日: 2006/12/23
投稿数: 4
投稿日時: 2006-12-23 22:12
現在、Oracle10GでPL/SQLの開発を行っています。

基本的な事かもしれませんが、質問させてください。

テーブルA.1に格納されている値にスペースが存在した場合、

テーブルA.1のスペースより以前の値をテーブルB.1へ更新

テーブルA.1のスペースより以後の値をテーブルB.2へ更新

EX)
テーブルA.1の内容:012345 6789

テーブルB.1の内容:012345
テーブルB.2の内容: 6789

といったUpdateを行いたいのですが、実現できる方法はありますでしょうか。

よろしくお願いします。


Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2006-12-24 12:39
文字列中にスペースが存在するか→INSTR
(もしくは WHERE 条件で LIKE を使う)
文字列を切り出す→SUBSTR
といった関数を使うと実現できると思います。

テーブルB.1というのがテーブルを指しているのか(とすればカラム名が不明)カラムなのか、テーブルB.1とテーブルB.2は違うテーブルなのか同じテーブルの別カラムなのか、更新のキーカラムは何かなどがわかりませんが、上記太字の語とSQLを条件にしてネット上で検索してみるとよろしいかもしれません。
(ちなみに、太字の語自体も「SQL 文字列」で見つけられます。)
yurayura
会議室デビュー日: 2006/12/23
投稿数: 4
投稿日時: 2006-12-26 20:19
Gioさん回答ありがとうございました。

無事、対応が完了できました。

今後とも宜しくお願いします。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2006-12-27 10:51
詳しくは技術系メーリングリストで質問するときのパターン・ランゲージを参照していただきたいのですが、yurayura さんが投稿された問題に対してどのような解(きちんと動くコード)をまとめとして書いておくと、他の方が似た問題に出会った時の参考になります。
(自分一人の問題が解決したからよいという考えには決して陥らないでください。)

ということで、どのようなクエリによって解決できたかを投稿していただけないでしょうか。
個人的に B.1 と B.2 が別テーブルなのか同一テーブルの別カラムなのか、特に前者である場合にトランザクション制御は大丈夫かなど、興味があります
yurayura
会議室デビュー日: 2006/12/23
投稿数: 4
投稿日時: 2006-12-27 13:13
お世話になります。

これ以外にも方法は他にもいろいろあると思いますが、
簡潔に記載すると私の場合は、このようなコードで解決しました。

--テーブルA.1のスペースの取得
SELECT INSTR(テーブルA.1,' ') INTO SPACE FROM テーブルA ※条件略
--テーブルA.1の桁数取得
SELECT LENGTH(テールA.1) INTO LEN FROM テーブルA ※条件略

--スペースが存在したら
IF SPACE <> 0 THEN
--テーブルB1の更新(スペースより前)
UPDATE テーブルB SET テーブルB.1 = SUBSTR(テーブルA.1,0,SPACE - 1)
--テーブルB1の更新(スペースより後)
UPDATE テーブルB SET テーブルB.2 = SUBSTR(テーブルA.1,SPACE + 1,LEN)
--スペースが存在しなかったら
ELSIF SPACE = 0 THEN
UPDATE テーブルB SET テーブルB.1 = テーブルA.1
END IF;

Gioさんの質問ですが、
>B.1 と B.2 が別テーブルなのか同一テーブルの別カラムなのか
⇒B.1 と B.2は同一テーブルの別カラムです。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2006-12-27 14:33
解決策を回答していただき、ありがとうございます。

細かいことを上げると、

  • 同一テーブルの複数のカラムを同時に更新する場合、UPDATE 文は一回で良い。
  • 二回に分けている方法では後の UPDATE がなんらかの理由で失敗した場合、最初の UPDATE だけが実行されてデータが不整合になるおそれがある。(これは別途、外側でトランザクション管理をしていれば大丈夫です。)
  • ELSIF SPACE = 0 THEN は ELSE だけで良い。(SPACE 変数が <> 0 でも = 0 でもない状態になることはありませんので

等々ありますが、他の方が似た問題に出会った時に参考になる情報としてまとまっていると感じました。
yurayura
会議室デビュー日: 2006/12/23
投稿数: 4
投稿日時: 2006-12-27 17:26
お世話になります。

IF分の条件やUPDATEの条件が、各UPDATE単位に異なっており省略してしまいました。。。

回答例文では確かにGioさんのおっしゃる通りです。

今後とも宜しくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)