SQL文のロジックについて

このQ&Aのポイント
  • SQLの初心者の方へ、具体的な例を交えてSQL文のロジックについて解説します。
  • 例えば、文字列を分割したい場合にはどのように記述すれば良いのかご紹介します。
  • また、条件を指定してデータを抽出する方法についても解説いたします。
回答を見る
  • ベストアンサー

SQL文のロジックについて

SQLの初心者ですので具体的な例でお答えいただければうれしいです a  char(13)   の中に ’099-222-5678 ’ と入ってるとします ’-’の場所は不定です aの値を、’099’、’222’、’5678’に分けるときは どのように記述したら良いのですか? もうひとつ・・・ AというファイルのKEYが、社員コード、連番で内容が名前 社員コード、連番、名前 とあるとして 1社員コードに対して連番が10件存在する・・・として 名前は連番に対してあると思います そこで、名前がSPACEでかつ連番が一番小さいデータを一件 だけ抽出するにはどんなWHEREかけばよろしいのですか? よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

こんばんは。 ホントにSQLでやっちゃうんですか??? お勧めはしませんが・・・、 SELECT SUBSTR(a, 0, INSTR(a, '-') - 1), SUBSTR(a, INSTR(a, '-') + 1, INSTR(a, '-')), SUBSTR(a, INSTR(a, '-', - 1) + 1) FROM テーブル 一応動きますよ。 (^^ゞ

bobu-desu
質問者

お礼

ありがとうございます ほんとうにたすかりました

その他の回答 (2)

回答No.2

こんにちは。 1番目は「substr」と「instr」をゴリゴリ書けばできますが、効率的ではないでしょう・・・。 ストアド側で「split」などで分けた方が無難です。 2番目は、 SELECT MIN(連番) FROM A WHERE 名前=' ' GROUP BY 社員コード かな・・・? 未確認です・・・。 (^^ゞ

bobu-desu
質問者

補足

take451213様  こんにちは COBOLで生きてきた人間なので ゴリゴリと言われても・・・ちょっとわからないので 簡単な例を書いていただけるとうれしいのですが・・・ よろしくお願いします 2番目の件は 試して見ます ありがとうございました

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

1.DBの種類は? 2.これらのことをSQLで行いたいんですか?プログラムでロジックを組んで行いたいのですか?プログラムで行いたいんでしたら言語は何ですか?

bobu-desu
質問者

補足

taka_tetsu様 1: DBはSQL SERVERです 2: 現在ストアドプロシージャでプログラムを組んでいますそれで、SQL文を書いているのですが・・ COBOLしかやったことのない初心者ですので できれば、詳しい具体例を書いていただければ うれしいのですが よろしくお願いします

関連するQ&A

  • SQL文をどう記述すれば良いか教えて下さい。

    テーブルAが以下の様に在るとします。 連番(ユニークキー)/日付/社員コード/所属コード そして、社員コード、所属コードの名称が、テーブルBに登録されています。 区分/コード/名称 ここで、区分+コードでユニークキーとなっていて、区分=1は社員コード、区分=2は所属コードとなっています。 単純に、テーブルAから、ある日付を指定して、連番・社員コード・所属コードを取得する場合、SQL文は以下の様になると思います。 SELECT 連番,社員コード,所属コード FROM テーブルA WHERE 日付='20030401' この時、同時に、テーブルBから社員コードに対応する名称、及び所属コードに対応する名称を取得したい場合は、どの様に記述すれば良いのでしょうか?

  • 【初歩的な質問ですが・・・】 SQL文書き方がわかりません

    SQLの知識に乏しい者です。 よろしくお願い致します。 ●テーブルA ・会計コード ・年度 ・部署番号 ・社員番号 ・その他幾つかのデータ ※Where句で「年度>2002年」以降を抽出 のテーブルがあります。 この時、Bテーブルで ●テーブルB ・会計コード(主キー) ・年度 ・部署番号(主キー) ・社員番号(主キー) ・その他幾つかのデータ ※Aテーブルで抽出されたデータの中から絞り込む というテーブルを抽出するSQL文を組みたいのですが、効率の良いやり方がわかりません。 副問合せで  Select [B表で抽出した列名…]  From B表  Where 会計コード = (Select 会計コード               From A表               Where 年度 > '2002')  AND 部署番号 = (Select 部署番号             From A表               Where 年度 > '2002') ・・・・以下省略 の様に書くと効率が悪い気がしました。 (実際には、副問合せが6個書くことになるため) 良い書き方を知っている方がいらっしゃいましたら、よろしくお願い致します。

  • SQLのSELECT文教えてください。

    VB5.0で、DBはSqlServer2000です。 SQL文のSELECT文で質問です。 ○A_TABLEの構成(概略) ・・・担当コード1・・・担当コード2 ○TANTO_TABLE 担当コード/担当名 (質問)TANTO_TABLEからA_TABLEの担当コード1と担当コード2の担当名を抽出したいのです。 次のSQLだと担当コード1のみしか抽出できません。 効率よく担当コード1と2の担当名を抽出するSQLを教えてください。お願いします。 SELECT 担当名 FROM A_TABLE,TANTO_TABLE WHERE A_TABLE.担当コード1 = TANTO_TABLE.担当コード

  • SQL文

    名前、性別、年齢の載っているA表から19歳以下の女性、または26歳以上の女性の名前を抽出するSQL文はSELECT 名前 FROM 表A WHERE 性別=’女’AND 年齢<20 OR 性別=’女’AND 年齢>25 が正解ですが、性別=’女’を1回にして SELECT 名前 FROM 表A WHERE 性別=’女’AND 年齢<20 OR  年齢>25 ではだめでしょうか。教えてください。

  • sql文

    key cd  A  B  C  1  001 101 2  001   102 3  001      103 4  002 102 5  002   104 というデータがある時 同じcdで1つにまとめて    cd  A  B  C    001 101 102 103   002 102 104 というようにしたいと思っています A、B、Cはそれぞれchar型で 空白分にはデータは" "が入っています どのようなSQLにすればできるでしょうか?

  • Accessのsql(ロジック)について伺います

    Access mdb内でローカルDB(ADO)へSQL接続を行うプログラムを組んでおります。 ■テーブル:マスタTBL | 年 | 月 | 日 | 時 | 分 | 秒 | コード | +---- +-- +-- +-- +--+---+------+ | 2013 | 10 | 31 | 10 | 05 | 20 | A1234 | | 2013 | 10 | 31 | 10 | 10 | 00 | B1234 | | 2013 | 11 | 01 | 00 | 00 | 01 | A1234 | | 2013 | 11 | 01 | 00 | 00 | 01 | A1234 | | 2013 | 11 | 01 | 00 | 00 | 01 | A1234 | | 2013 | 11 | 22 | 05 | 10 | 09 | C1234 | | 2013 | 10 | 31 | 00 | 10 | 00 | B1234 | | 2013 | 10 | 31 | 22 | 46 | 55 | A1234 | ※後の作業都合上、日付も含めカラムは全て"文字列"です。 ※全カラム、nullは存在しません。 ※各レコードの格納順に統一性はありません。 ※動作環境はAccess mdb(Office 2007)/Windows7(32bit)です。 【最終的にやりたいこと】 マスタTBLより、最繁日3日分(同じ年月日のレコード数が多い上位3日分)を選定し、 更に時間別、かつコード別の件数を求める(.csv出力)のが最終目標です。 SQL一発でできれば良いのですが、私の力ではそれが組めないため2段階に分け、 第1段階として別の作業用TBLを作成し、まずそこに最繁日3日分を抽出&登録、 第2段階で作業用TBLに対して時間別・コード単位の抽出を行う段取りとしました。 ご質問は、第1段階を満たすSQLについてです。 【ご質問】 上記のテーブルがあるとします。 この中から、最繁日3日分(同じ年月日(時分秒は考慮不要)のレコード数が多い上位3日分)の全レコード(抽出には時分秒も必要)を抽出し、同設定の別テーブルへ登録したい。 と言うのがやりたい事なのですが、抽出するSQLが作れず困っております。 現group by設定をしてしまうと、Countさせて上位日数と件数は判明できますが、その全レコードを羅列させる事ができません。 抽出段階で考慮すべきは日付までなので、group byを考えて時分秒を省いてしまうと、その後秒単位で抽出が必要な第2段階が行えなくなってしまいます。 また時分秒をSELECTに指定してしまうと、group byでも時分秒を加えなくてはいけなくなり、「日付3日分で」が満たされなくなってしまいます。。。 現在、group by有りで作成済みのSQL、および出力結果例は下記の通りで、 全く先に進まなくなってしまいました.... [SQL] 'SQL作成 変数A = "INSERT INTO 登録したいTBL " _ & "SELECT 年,月,日,時,分,秒,コード,COUNT(*) AS CNT " _ & "FROM マスタTBL " _ & "group by 年,月,日,時,分,秒,コード " _ & "order by 年,月,日,時,分,秒,コード;" 'SQL実行 Call db.Execute(変数A) [実行結果例] ■テーブル:登録したいTBL | 年 | 月 | 日 | 時 | 分 | 秒 | コード | カウント | +---- +-- +-- +- -+- -+-- +----- +-------+ | 2013 | 10 | 31 | 10 | 05 | 20 | A1234 | 2 | | 2013 | 10 | 31 | 10 | 10 | 00 | B1234 | 2 | | 2013 | 11 | 01 | 00 | 00 | 01 | A1234 | 3 | | 2013 | 11 | 22 | 05 | 10 | 09 | C1234 | 1 | 現状では当然の出力結果ですが、本来出力したいのは、カウントが3件の3レコードと、 2件のレコード*2つ、合計7レコードを出力させたいと言う意味です。 (カウントは必要かと思ったので入れているだけで、仕様上は別に無くても良い物です。) また、とりあえずですが上記SQLが正しく実行され登録したいTBLへ格納される事は確認済みです。 やり方がそもそも間違えている可能性もございますので、その点も含めご指摘ございましたらお願い致します。 以上です。 ご提示できる条件が少なく申し訳ございませんが、ご回答頂ける方がいましたら、 ご教授をよろしくお願い致します。

  • SQL文の構築について教えてください。

    SQL文の構築について教えてください。 こんばんは。Oracle9iのデータベース検索で、どうしてもSQLが思い浮かばないため、質問させていただきます。 ■Table ID    NUM   SIGN 100   1    A 100   2    A 101   1    A 102   1    B 103   1    B 104   1    C 首キーはID、NUMです。 上記のようなテーブルで、 IDが同一かつNUMが最大のもので、 SIGNが同一のレコードで、2件以外のレコードを抽出したいです。 (例表でいうと、ID104のレコードのみが抽出されるようにしたい) すこし急ぎなんですが、SQLが得意でお時間がある方、力を貸していただけないでしょうか。 よろしくお願い致します。

  • SQL文の作成について

    はじめまして SQL Serverを使用テーブルの更新クエリを作っています。 ◆質問 副問合せの結果をIn句で見ていますがExists句の方がパフォーマンスがあるといわれているので直したいと思っています。 可能でしょうか? ◆SQL文 UPDATE [TABLE_A] SET Data = null WHERE Code IN (Select Code From [TABLE_B] B, [TABLE_C] C Where (B.Start <= GetDate() AND C.End >= GetDate()) AND (B.TimeCode = C.TimeCode)) ◆KEY [TABLE_A].Code = [TABLE_B].Code [TABLE_B].TimeCode = [TABLE_C].TimeCode ◆[TABLE_A] Code Data 001 100 002 200 003 300 004 400 <- DataをNullにする ◆[TABLE_B] Code TimeCode 001 AAA 002 AAA 003 AAA 004 BBB <- 今日2/18ヒット 001 CCC 002 CCC ◆[TABLE_C] TimeCode Start End AAA 2009/1/1 2009/2/15 BBB 2009/2/13 2009/2/20 <- 今日2/18ヒット CCC 2009/2/19 2009/10/5 データは[TABLE_A] 6万件、[TABLE_B]が20万件、[TABLE_C]が100件程度です。 夜遅くにすみませんがお願いします。

  • SQL文について

    OracleやSQLについてはまだ初心者のレベルで理解が浅いので言葉足らずかもしれませんがよろしくお願いします。 以下のようなテーブル(名称:TBL)があったとします。 SHOP_CODE------SHOP_NUMBER----MONEY1------MONEY2 A ---------------- 1 ---------------- 100 ------------- 200 B ---------------- 2 ---------------- 300 ------------- 400 C ---------------- 3 ---------------- 500 ------------- 600 D ---------------- 4 ---------------- 700 ------------- 800 例えば、SHOP_CODEがA~Dのどれかの行(レコード)はそのまま抽出して、残った行(レコード)はMONEY1およびMONEY2を0に変更して抽出しようとした場合、 SELECT * FROM TBL WHERE SHOP_CODE = 'ここはA~Dのどれかを代入' UNION SELECT SHOP_CODE, SHOP_NUMBER, 0, 0 FROM TBL WHERE SHOP_CODE <> 'A~Dのどれかを代入' このようなSQL文を考えてみました。 しかし、比較的簡単な例ならばよいのですが、UNION前のSELECT文が複雑になってきた場合のことを考え以下のような文の作りかたができないかと思いました。 SELECT * FROM TBL WHERE SHOP_CODE = 'ここはA~Dのどれかを代入'・・・『この時点で抽出した塊になんらかの名称をつける(例:tbl)』 UNION SELECT SHOP_CODE, SHOP_NUMBER, 0, 0 FROM TBL WHERE SHOP_CODE <> tbl.SHOP_CODE・・・『このようにUNION以前に抽出した塊の名称を利用して条件を作成』 このような方法ができるとした場合、前段階で抽出した塊にどのような方法で名称をつけるのか分かりませんでした。(汗)そもそもできるかどうかもわかりませんが、、、(^^; 最初のSQL文がベターな方法なのかも分かりませんが、上記に示した方法で抽出することが可能でしょうか?もしできるのならば、前述したように名称をつけて条件を作成する方法等を教えていただきたいと思います。 おおよそ話を分かっていただければよいのですが、ものすごく簡単に言うと一つのテーブルのある行とある行に別々の処理をして再構成したいというようなイメージです。(今回はMONEYを0にすると仮定しました) できれば上記の方法に沿った考えで回答をいただけると私も助かりますが、もっと良い方法があれば是非伺いたいと思います。お時間の方ありましたらよろしくお願いします。

  • エクセルVBAでのSQLについて

    エクセルVBAで、SQLを記述しているのですがwhereの抽出条件にセルの値を指定したいと思っています。その当該セルの値を変更することで、抽出条件を変更することができるようにしたいです。 しかし、どのような記述にすればよいか分かりません。以下のような記述をしたのですが、うまくいきません。すみませんが、教えていただけないでしょうか。よろしくお願い申し上げます。 ◆抽出条件を指定するセル:A1 セルA1には、数字(例:1000、2000等)をいれます。 mySQL = " SELECT * FROM [◆◆シート!] WHERE Range("A1")"

専門家に質問してみよう