• 締切済み

【PL/SQL】カンマ区切りのレコード、データ取り出し

超初心者です。 2つの編集ワークを宣言して、WORKにカンマ区切りのレコードを作成します。 そしてWORKの「matumoto」だけを取り出してRECORDに入れたい場合、どうしたらいいのでしょうか? そのまま「matumoto」を放り込めとか言われそうですが、実際はSELECTして取り出してきたデータもろもろをカンマ区切りでWORKに1レコード放り込んで、必要なものだけをRECORDに入れるという動きをさせています。 質問させていただくにあたってこういう記述にさせていただきましたのでご了承ください^^; よろしくお願いします。 /* 宣言 */ WORK VARCHAR2(1000); RECORD VARCHAR2(1000); WORK := ''; RECORD := ''; WORK := WORK || '"' || aoki || '",'; WORK := WORK || '"' || matumoto || '",'; WORK := WORK || '"' || yosida || '"'; WORK(中身はこんな感じ)→"aoki","matumoto","yosida"

  • Oracle
  • 回答数2
  • ありがとう数3

みんなの回答

  • joih
  • ベストアンサー率35% (37/105)
回答No.2

n番目のデータを取り出したいなら、 カンマの数を カーソル処理で数えて INSTRでとりだしたらどうですか。

akigiri0213
質問者

お礼

ありがとうございました。

  • joih
  • ベストアンサー率35% (37/105)
回答No.1

SELECT SUBSTR( '"aoki","matumoto","yosida"' ,INSTR('"aoki","matumoto","yosida"', 'matumoto') ,LENGTH('matumoto') ) FROM DUAL キテレツな処理ですね。 プログラムの設計が悪い香りがプンプンしますが。 INSTR関数で開始位置がわかるので、 matumotoの長さ分だけSUBSTRで取り出します。

akigiri0213
質問者

補足

お返事ありがとうございます。 私も色々おかしいと思います汗 というかまず質問の書き方がまずかったです。 カンマ区切りのデータが大量にあって、matumotoに限らず全て違うものが入っていて、文字数も違うんです。 "0","suzuki","tarou","1980/02/10","A","123-2000","toukyouto","sibuya","3-2-102"....... みたいな感じで、N番目を取り出したいといった感じです。 名前と生年月日を取り出したいとか、血液型と住所を取り出したいとか。 名前や住所なんて人によって桁数も違うので… VBみたいにsplitとかないんですかね? WORK[2]みたいな添え字で指定したりとか… よろしければアドバイス等よろしくお願いいたします。

関連するQ&A

  • csv(カンマ区切り)の読み込みと書き出し

    Visual Basic Express Edition 2008での質問です。 下記のようなカンマ区切りのCSVファイル(拡張子はtxt)があります。 (150万行以上あるので、エクセルでの編集が出来ません) 1,18845.50,-14572.50,16.30,1 2,18846.50,-14572.50,16.29,1 3,18832.50,-14573.50,16.25,1 で、実はこのCSV形式のファイルの一番左のレコードと 一番右のレコードは必要ないので削除し、 18845.50,-14572.50,16.30 18846.50,-14572.50,16.29 18832.50,-14573.50,16.25 上記のようなデータにして、再び同じ形式で保存したいのです。 どなたか、いい方法orソースの提供をお願いしたいです。 可能ならば、複数のデータ (そのテキストファイルが200個ほどあるので)に対して、 プログラムを実行できればなおいいと思います。 よろしくお願いします。

  • REGEXPで希望の動作をしてくれない

    MySQLは5.0を使っています。 1のフィールドに「11,28,33」と言うようにカンマ区切りのデータを保存しています。 下記ページと全くやりたいことが同じだったのですが、 http://q.hatena.ne.jp/1194079682 SELECT * FROM test_db WHERE user_id REGEXP '^11$' にしても抽出してくれません。 フィールドを「11」のみにすると問題なく抽出してくれました。 カンマ区切りのデータから特定の数字を抽出するためには他になにが必要でしょうか。 フィールドがvarcharなのがいけないのでしょうか。

    • ベストアンサー
    • MySQL
  • DBデータをcsvで出力の際カンマでエラー

    下記の構文で、mysqlのデータをcsvに出力したいのですが、 カンマ区切りのカンマ部分でエラーになります。 phpかmysqlの設定なのでしょうか? どなたかご教授お願いいたします。 ---以下スクリプト header("Pragma: cache;"); header("Content-type:application/x-csv"); header("Content-Disposition: inline; filename=db_out.csv"); mb_language ('Japanese'); $db = DB::connect($dsn); if(DB::isError($db)){ die($db->getMessage()); } $sql = "select email,adress,date from table "; $result = &$db ->query($sql); if(DB::isError($result)){die($db->getMessage());} while ($record = $result->fetchRow(DB_FETCHMODE_ASSOC)) { $csv_line =&sprintf("%s,%s,%s\n" ,$record['date'] ,$record['email'] ,$record['adress']); print(mb_convert_encoding($csv_line, "SJIS", "EUC-JP")); } $db->disconnect(); --------------ここまで エラー内容 Parse error: syntax error, unexpected ',' 行数を見ると csv_line =&sprintf("%s,%s,%s\n" この行です。 環境は php4.4.4 mysql4.1.21 FreeBSD Apche1.3.37 です。よろしくお願いします。

    • 締切済み
    • PHP
  • カンマ区切りで値の取り出し

    XML内のある値が","で区切られていて、これを一つずつ取得したいのですが、 いいサンプルがなくて困っています。 【例】<abc>1,2,3,4</abc> この中の値は4つとは限りません。 2つであれば、substring-before substring-after、 でいけると思うのですが、例のような場合に for-eachを使って一つずつ取り出せないでしょうか。

    • ベストアンサー
    • XML
  • 変数の取り扱いについて

    はじめまして。思いっきりSQLSERVERは初心者なんですが宜しくお願いします。 現在SQLSERVER2005です。 ややこしくなるので要点だけ以下まとめています。 変数を利用してレコードを抽出する時なんですが… ALTER PROCEDURE Test @Rank INT BEGIN DECLARE @SELECT AS VARCHAR(100) DECLARE @WHERE AS VARCHAR(100) DECLARE @SQL AS VARCHAR(200) SET @SELECT = 'SELECT * FROM tblA ' SET @WHERE = 'WHERE Rank > ' + @Rank SET @SQL = @SELECT + @WHERE EXEC(@SQL) END 実行すると varchar の値 'WHERE Rank > 'をデータ型 int に変換できませんでした。 となります。 Rank部分が数値なんですが、どのように取扱いすべきなんでしょうか。

  • splitの使用方法

    String.split の使用に関してです。 ファイルから一行づつ読み出して split で切って配列にしたいと考えています。 ファイルの中身は 1|ssm3u|00000| 2|ssm3u|11111| のように「|」区切りになっています。 通常のcsv等、カンマ区切りのファイルは split(","); を使用して問題なくできたのですが、 split("|"); と書くと、 「|」ではなく、1文字ごとに切ってしまいます。 どうすれば「|」ごとに切ることができるのでしょうか? あるいは、私のプログラム記述ミスでしょうか?

  • コンマ区切りのデータを数える

    id place 5 上野 6 銀座 7 銀座 これに対して SELECT place,count(*) FROM tb GROUP BY place ORDER BY COUNT(*) DESC; でplaceのvalueごとのランキング的なものを作成することはできたのですが id place 5 上野 6 銀座,東京 7 銀座,上野 8 銀座 に対して place COUNT(*) 銀座 3 上野 2 東京 1 という表を表示したいのですが、可能ですか?

    • ベストアンサー
    • MySQL
  • 【PL/SQL】CURSOR ・・・ IS SELECT・・・FOR UPDATE が機能しない

    カーソルの宣言で、FOR UPDATE を指定しているのに、 WHERE CURRENT OF での更新が効きません。 エラーは発生せず、全件分ループも回っているのですが、値がまったく書き換わっていません。 Oracle Ver. = Oracle8i Release 8.1.6.0.0 CREATE OR REPLACE FUNCTION TEST_FNC RETURN BOOLEAN IS todofu_cd NUMBER(2) := 0; strSQL VARCHAR2(2000) := ''; CURSOR cur IS SELECT * FROM TEST_TBL FOR UPDATE; BEGIN For cur_rec In cur Loop DECLARE BEGIN SELECT TODOFU_CD INTO todofu_cd FROM M_POST WHERE POST_NO = cur_rec.POST_NO; EXCEPTION When NO_DATA_FOUND Then todofu_cd := 0; END; UPDATE TEST_TBL SET TODOFU_CD = todofu_cd WHERE CURRENT OF cur; COMMIT; End Loop; EXCEPTION  (省略) END; / 「CURSOR cur IS SELECT * FROM TEST_TBL FOR UPDATE;」の部分は、 「CURSOR cur IS SELECT POST_NO, TODOFU_CD FROM TEST_TBL FOR UPDATE OF TODOFU_CD; 」と記述しても結果は同じでした。 上書きしようとしている値である「todofu_cd」にきちんと望む値が格納されていること、ループが正常に回り、各行にアクセスしていることは、確認済です。 原因が分かる方がいらっしゃいましたらご教授下さい。 また、質問の内容に不備があるようでしたら、ご指摘下さい。 以上、どうかよろしくお願い致します。

  • Symfowareでの動的SQL

    富士通のSymfowareでC言語での動的SQLを使ったプログラムを実行したいのですが、疑問点が2点あります。 諸事情でマニュアルも環境もないのにコーディングしないといけません。 1.EXEC SQL EXECUTE IMMEDIATE 'SQL文' ; は使用できますか? ORACLEなどでは EXEC SQL EXECUTE IMMEDIATE 'DELETE FROM A' ; などと記述できますが・・・ 2.検索系(SELECT)も1.のように動的に 実行したいのですが、検索結果をカンマ区切りで 編集する必要があります。 しかも、SELECT文は文字列としてくるので、 あらかじめ構造体等で定義してFETCHするようなこと   はできません。 ORACLEの場合は、ちょっと難しいですが、できるようです。 Symfowareでは可能でしょうか? Symfowareの情報があまりにも少ないので、わかる範囲でかまいません。 よろしくお願いします。

  • EXCEL VBAでのCSVファイルの編集

    CSVファイル(ダブルクォーテーション)形式のファイルをEXCEL VBAにて行の編集(削除)をした後、上書き保存をしたらダブルクォーテーション区切りではなくカンマ区切りのCSVファイルの形式になってしまいます。 ダブルクォーテーション区切りのCSVファイルで上書き保存する記述があれば教えて下さい。おそらくEXCELでCSV形式の上書きはCSV2の形式で保存されるみたいです。 困っています。どなたかお助け下さい。