• ベストアンサー

SQL文にて・・・

質問があります。PostgreSQLです。 テーブル(test_tbl)があるとします。 テーブル構成は --------------------------- id ===== char(16) [英数文字格納] point ==== int2 add_date ==== timestamp --------------------------- このテーブルから idが2文字目から'di6ek68dh5ls7g'のレコードを取得したいと考えています。 レコード数がかなりおおいので パフォーマンスを重視したいのですが、 検索SQLがわかりません。 select * from test_tbl where id like '%di6ek68dh5ls7g'だとでると おもうのですが、 これ以上にパフォーマンスがあがる SQLがわかる方お願いいたします。

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

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

SUBSTRING関数ですかねぇ。 SUBSTRING(a,b,c) aの文字列の、b文字目からc文字分抽出します。 cを省略すると、最後までになります。 今回の場合は SELECT * FROM test_tbl WHERE SUBSTRING(id,2) = 'di6ek68dh5ls7g' likeはパフォーマンス低下につながりますので、 なるべく使わないよう頑張りましょう~ # OracleならSUBSTR関数、AccessだとMID関数です。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SQL文作成のお願い

    前提として下記のようなテーブルがあります。 テーブル名:test フィールド: 1)id: varchar, not null 2)name: varchar 3)date: timestamp with time zone, not null このテーブルに下記のようなレコードがあります。 '00001', 'A', '2005-01-01 00:00:00' '00001', 'B', '2005-07-01 00:00:00' '00001', 'C', '2005-11-01 00:00:00' '00002', 'X', '2005-01-20 00:00:00' '00002', 'Y', '2005-07-20 00:00:00' '00002', 'Z', '2005-11-20 00:00:00' ■今やりたいこと このテーブルからidごとにdateフィールド値が最近のレコードを取得したい。 ■やってみたこと 下記SQLを発行しました。 >select id, max(date) from test group by id order by id 結果==> 00001 2005-11-01 00:00:00 00002 2005-11-20 00:00:00 実際はnameフィールドの値も取得したいのですが、group by句を使うとフィールド指定ができませんでした。 ■だめだったSQL select id, name, max(date) from test group by id order by id どのようにSQLを書けばよろしいでしょうか?

  • 日付間の判定について

    質問させてください。 PostgreSQLで以下のテーブルがあるとします。 test_tbl ---------------------------- id==========int4 start_day===timestamp end_day=====timestamp ----------------------------- 以下のテーブルにデータをinsertしたいとかんがえています。 このとき、既に入力されているデータの start_day, end_dayにかぶらずに入力したいとかんがえています。 たとえば ---------------------------- record1 ---------------------------- start_day:2003-11-27 18:00:00 end_day :2003-11-27 18:15:00 ---------------------------- record2 ---------------------------- start_day:2003-11-27 18:45:00 end_day :2003-11-27 19:00:00 ----------------------------- というレコードが既にtest_tblに格納されていたら、 ---------------------------- insert1(●) ---------------------------- start_day:2003-11-27 18:20:00 end_day :2003-11-27 18:40:00 ----------------------------- insert2(●) ---------------------------- start_day:2003-11-27 17:45:00 end_day :2003-11-27 17:50:00 ----------------------------- insert3(×) ---------------------------- start_day:2003-11-27 18:05:00 end_day :2003-11-27 18:30:00 ----------------------------- insert4(×) ---------------------------- start_day:2003-11-27 18:50:00 end_day :2003-11-27 19:20:00 ----------------------------- insert5(×) ---------------------------- start_day:2003-11-27 18:30:00 end_day :2003-11-27 19:20:00 ----------------------------- 上記の判別するSQLがうまくつくれません。 どうかアドバイスを下さい。宜しくおねがいいたします。

  • SQLの書き方

    はじめまして SQL Serverを使用していますが、下記のSQLの書き方がわかりません。 申し訳けありませんが、わかる方がいらっしゃいましたら、どなたか教えて下さい。 ◆質問 テーブル1とテーブル2の下記のKEYで結合させて、取り出した結果でテーブル3を更新したいです。 テーブル2はデータが複数件一致してしまうため、無条件に先頭の1レコードだけを取り出したいです。 取得できたテーブル2のid_1とid_2とid_3をテーブル3に書き出したいです。 ○KEY テーブル1.test = テーブル2.test and テーブル1.test1 = テーブル2.test1 テーブル1.id_2 = テーブル3.id_1 and テーブル1.id_3 = テーブル3.id_2 ○テーブル1 id_1   id_2   id_3   test   test1 bbb   000001   001   000001  100 bbb   000002   001   000002  100 ○テーブル2 id_1   id_2   id_3   test   test1 aaa    1    99    000001   100 ← このレコードを取り出したい aaa    2    99    000001   100 aaa    3    99    000003   100 aaa    4    99    000004   110 ○テーブル3 id_1   id_2   id_3 000001  001  aaa-1-99   ←id_3にテーブル2で取得できたid1 + id2 + id3を書き出したい 000002  001 夜遅くにすみませんがお願いします。

  • SQLの相談

    SQLの相談です。 以下のようなテーブルについて CREATE TABLE `record`( `id` INT, `timestamp` TIMESTAMP, `point` INT ); 1) id毎に最新5件のデータを抽出 2) 合計pointが420以上のidだけを抽出 したいのですが…。 1)の処理について、うまい解決策を思いつきません。 助言をお願いします。

  • SQL文の書き方について

    お世話になります。下記のような結果を求めるSQL文についてどなたかご教示をお願いします。 以下の2つのテーブル(SMPL_TBL1,SMPL_TBL2)があったとします。 (SMPL_TBL1) ID | NAME | BUSHO ---+--------+--------- 01 | YAMADA | A_GRP 02 | SUZUKI | A_GRP 03 | OKADA | B_GRP 04 | TAKAGI | C_GRP (SMPL_TBL2) ID | POINT | ---+-------+- 01 | 1 | 01 | 2 | 01 | 3 | 02 | 1 | 02 | 2 | 03 | 1 | 04 | 1 | 04 | 2 | 04 | 3 | 04 | 4 | 04 | 5 | 上記テーブルから以下のような結果を得たい場合、 どのようなSQL文を投げればいいでしょうか? (求める結果) ・各人ごとのPOINTのMAX値と各人のデータを抽出(POINTは1~999までの整数です) ID | NAME | POINT| BUSHO ---+--------+------+-------- 01 | YAMADA | 3 | A_GRP 02 | SUZUKI | 2 | A_GRP 03 | OKADA | 1 | B_GRP 04 | TAKAGI | 5 | C_GRP よろしくお願いいたします。

  • SQL文でご質問です

    ご存知の方がおられましたら、教えて下さい。 下記のように、親テーブルと親子を管理するための親子管理テーブルがあります。 条件として、CD1の1が指定された時、親テーブルよりNOが2のレコードと(これは親子関係がないレコード) 親子関係のレコードの親レコードであるNOが1のレコードと子レコードであるNOが11の3レコード を1つのSQL文で取得したいのですが、可能でしょうか? ご存知の方がおられましたら、ご教授のほどよろしくお願い致します。 親テーブル(OYA_TBL) NO,BN1,CD1 ------------- 1,4,NULL 2,NULL,1 3,NULL,NULL 11,4,1 12,4,2 13,4,NULL 親子管理テーブル(OYA_KO_TBL) GOODS_NO,PACK_GOODS_NO ------------- 1,11 1,12 1,13 ↓ [取得結果] NO,BN1,CD1 ------------- 1,4,NULL 2,NULL,1 11,4,1

  • 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文について

    このジャンルでお願いします。 tbl id  starttime endtime val 1     0      40  3 2     160    170  1 3     160    190  2 starttimeとendtimeは「分(160なら60×2+40で2時40分になります)」で保存してます。 このようなテーブルで、時間毎にvalの平均を出したいのですが、 id  hour avg(val) 1    0   3  ← 0~1時まで 2    1   0  ← 1~2時まで 3    2   1.5  ← 2~3時まで 4    3   2  ← 3~4時まで ・ ・ 24   23   0  ← 23~24時まで といった感じで24区間に分けてその区間毎のvalの平均を出したいです。 これはどのようなSQL文になるのでしょうか? またこのようなSQL文で1度に取得するやり方と、 いったん全行取得してPHPなどでループして平均を計算するやり方とでは レコード数が増えてきた場合にどちらが速いとかはあるのでしょうか?

    • ベストアンサー
    • MySQL
  • SQL文のエラー

    PostgreSQLの初心者です。よろしくお願いします。 今、日本語ODBCドライバを使ってクライアント側を VB.NETでプログラムを作っています。PostgreSQLは8.1.4です。 レコードの追加をするために、レコードIDのMAX値を 撮るためにプログラム中にSQL sql = "SELECT MAX(user_id) AS MaxID FROM user" を入れて発行したところ、本来ですと「1」が返って こなければいけないのに、 Msgbox(MaxID) を仕込むと「0」が返ってきます。そして、その後に ERROR [HY000] Error while executing the query; ERROR; operator does not exist: # integer というエラーが返ってきます。 先ほどのSQLはリモートで直接PostgreSQLにつなぐと ちゃんと「1」が返ってくるのですが、VB.NET上では うまくいきません。 質問としては2つあります。 1)VB.NET上で実行すると、なぜ「0」が返ってきて しまうのか? 2)エラーメッセージの意味 の2点です。 よろしくお願いします。

  • 絞込みする時のSQLの書き方

    お世話になります。 絞込みする時のSQLの書き方について教えてください。 具体的には テーブル名tbl01,フィールド名f01,f02とした場合 1.f01もしくはf02にAという文字を含むレコードを抽出。 SQL = "select * from tbl01 where f01 like '%A%' or f02 like '%A%'" 2.続いて、1で抽出したデータからf01もしくはf02にBという文字を含むレコードを抽出するSQL文 SQL = ????? あくまでも、1と2を満たす条件を1つのSQL文で表す方法です。一旦、1の結果をワークテーブルに落とし、そこから2だけのSQL文を実行するわけではありません。

このQ&Aのポイント
  • 同じ職場で気になっている人とは、お互いに好意を持っているようです。
  • 紹介された別の職場の友人との関係が気になっているようです。
  • 付き合いたいと思う相手に対して、紹介するかどうか悩んでいるようです。
回答を見る