• ベストアンサー

(SQLite)テーブル名の検索

同じような名前のテーブルと名前の関連性が全くないテーブルが10個あるとします。 (例) a_test a_text a_talk users setting .... その中で名前が、a_から始まるテーブルの名前を取得したい場合はどうすればよいのでしょうか? 使用しているデータベースはSQLiteです。

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

  • ベストアンサー
noname#223623
noname#223623
回答No.2

[前置き] 自分はPerlを使わないのでわかりませんが、SQL文を実行して結果を取得するというのはできるはず。Perlに限らず、DBを扱える言語なら基本的にできないはずがない(というかできないと困る)。 具体的な手順は質問者さんの方が知っていると思うが、念のため検索で見つけたページを挙げておく。  ItsMemo::IT (旧) - SQLite+Perl: データを取得する方法  http://www.itsmemo.com/it/cgi/000075.html SQLiteのバージョン、使用するモジュールの違いで変わるところはあるだろうがそれは自分で調べてください。 [本題] 前置き部分が解決していれば、残る問題はテーブル名の一覧を取得するにはどういうSQL文を実行すればよいのかということだ。これについてはsqlite_masterというテーブルに問い合わせすれば取得できる。詳しくは次のページの「コラム:SQLITE_MASTER テーブルに対するクエリー」を参考に。  sqlite: SQLite データベースを管理するプログラム  http://www.net-newbie.com/sqlite/sqlite.html sqliteのコマンドで実行したのが以下の例。  sqlite> select * from sqlite_master;  table|a_test|a_test|3|create table a_test(id,text)  table|a_text|a_text|4|create table a_text(id,text)  table|a_talk|a_talk|5|create table a_talk(id,text)  table|users|users|6|create table users(id,text)  table|setting|setting|7|create table setting(id,text)  sqlite> select name from sqlite_master where type = 'table' and name like 'a_%';  a_test  a_text  a_talk  sqlite> モジュールによってはテーブル一覧を返す関数(メソッド)が用意されてるようですが、上記のやり方のほうが応用が効くので覚えておいたほうがいいと思います。

effector
質問者

お礼

理解できました。 わかりやすい説明ありがとうございました。

その他の回答 (1)

noname#223623
noname#223623
回答No.1

例えば「PHPのスクリプトからテーブル名を取得して配列に入れたい」というような状況説明がないのではっきりとは答えられません。 とりあえず、テーブル名を確認したいだけなら、SQLiteのプロンプトで ".table a_"とすると表示されます。  sqlite> .table <- 全テーブル名の一覧  a_talk a_test a_text setting users  sqlite> .table a_ <- a_で始まるテーブル名の一覧  a_talk a_test a_text 他の方法を期待してるなら補足お願いします。

effector
質問者

補足

Perlのスクリプトからテーブル名を取得して配列に入れたいです。お手数をおかけして申し訳ございません。

関連するQ&A

  • SQLiteにてテーブル一覧を取得したい

    SQLiteにてテーブル一覧を取得したい PHPにてSQLiteを使って勉強中なのですが、 sqlite_openでファイルを読み込み クエリーを投げて、そのファイルの中にあるテーブル一覧を取得したいのですが、 どのようにすれば一覧が取れるでしょうか? sqlite_query($sqlite, '.tables');だと構文エラーになってしまいますし、 execのような物から取ろうとするとかなり複雑なロジックになってしまいます。

    • ベストアンサー
    • PHP
  • 環境PHP5 Apache2.0 SQLite

    環境PHP5 Apache2.0 SQLite データベースSQLiteに関する質問なのですが、データベース名、テーブル名のみ解っている状態からテーブルで使用されている項目の一覧などは取得できますでしょうか? データベース名 くだもの テーブル名 くだもの リンゴ バナナ イチゴ  1   3   2  このようにテーブルのみ解っている状態から中身を見ずに項目「りんご」、「バナナ」、「イチゴ」を取得したのです。SQLiteで無くとも、他のデータベースで可能でしたらご教授ください。よろしくお願い致します。

    • ベストアンサー
    • PHP
  • SQLite vs MySQL

    お世話になります。 データベースにアクセスするperl CGIを造ろうとしています。 1データベース・1テーブルのみの単純なつくりで 1レコードはだいたい、intergerが10項目、char[12]程度のtextが10項目、dateが5項目、 全部で10,000レコード程度の小規模なものです。 ユーザ数は特定の約30人程度です。各人、一日に2~3レコードにしか書き込み操作はしないはずです(時刻は重なるかもしれません)。 速度がクリティカルに要求されるわけではありません。 SQLiteとMySQLの比較は、ネット上でも多数見つかり、多数ユーザならMySQL、single userならSQLiteという感想が多いですが、30人というのが「多数」なのか、どうなのかわかりかねましたので、使用実感をお聞かせください。 SQLiteで少し組んでみたのですが、きわめて容易に作れるし、バックアップも簡単なので、30人程度ならSQLiteでも問題なしということであればSQLiteにしたいところです。

    • ベストアンサー
    • MySQL
  • SQLiteのテーブルデータ移行について

    SQLiteについて質問します。 よろしくお願いします。 [環境] WindowsXP pro sp3 sqlite 3.6.9 [やりたいこと] SQLiteのテーブルのデータを、別のSQLiteのデータベースに移行したい。 ただし、移行の操作はすべてコマンドプロンプト上で実行したい。 [現状] 移行したいテーブルのデータをCSV形式でアウトプット出来ています。 [困っていること] 1.移行したいテーブルのデータに改行が入っていると、インポートに失敗してしまう。 >うまくインポートできる例 1,2,"あいうえお",5,6,2011/10/21 >インポートに失敗する例 1,2,"あいう えお",5,6,2011/10/21 2.CSVの文字列データの先頭と最後尾にある「"」も一緒にインポートされてしまう。 1,2,"あいうえお",5,6,2011/10/21 このデータをインポートした場合、 1|2|あいうえお|5|6|2011/10/21 この様にインポートしたいが、 1|2|"あいうえお"|5|6|2011/10/21 この様にインポートされてしまう。

  • SQLiteのデータベースについて

    PHP初心者です。以下のSQLiteより作成するデータベースについて教えてください。 $DB = sqlite_open('db1.db'); $sql="create table tables(id integer ,name,texts)"; $result=sqlite_query($db,$SQL); 上記、プログラムにより、同ディレクトリに、db1.dbが作成されますが、このデータベース情報はどのようにして、閲覧するのでしょうか(MS-ACCESS、SQLのように簡単に閲覧できないのか)。主キーやテーブルの名前またはフィールドの名前の変更、データ一覧閲覧などどのようにするのでしょうか。 環境は、Windows環境で、PHP4を使用しております。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Sqliteのリレーション

    ■利用環境 Sqlite3.3.5 データベース初心者で、 リレーションの概念等、理解出来てない 質問になってましたらすみません。 現在、テーブルを作成する事くらしかできません。 ■質問 Sqliteのテーブルプログラムから、 SQL関数を使ってつくっているのですが、 リレーションの設定の仕方がわかりません。 ■説明 Aと言うテーブルとBと言うテーブルがあるとき useridを主キーとして、お互いにリレーション を作るには、どのようにSQLを書けばよいですか?

  • PHP-SQLiteに於いて、複数列の検索方法を教えてください

    SQLiteの複数列の検索 SQLiteの勉強を始めたばかりなのですが、 複数列の検索方法が解らなくて、 色々調べましたが解らなかったので質問させてください。 データベースの中が |ID  |  氏名  |  住所       |  電話番号 |----|-------|--------------|--------------- |1  |山田   |埼玉県******** |03******** |2  |田中   |東京********** |03******** |3  |佐藤   |千葉県******** |090******** |4  |佐々木  |埼玉県******** |090******** ----------------------------------------------------- 期待する動き 例1) 住所:埼玉県 と検索すると 山田,埼玉県********,03******** 佐々木,埼玉県********,090******** と表示される 例2) 名前:山田 住所:埼玉県 と検索すると 山田,埼玉県********,03******** と表示される ※ユーザーからはどの項目を検索対象とされるか解らない。 test.phpの内容 //フォームからID取得 $search_id = $_POST['id']; //フォームから氏名取得 $search_user_name = $_POST['search_user_name']; //フォームから住所取得 $search_home_address = $_POST['search_home_address']; //フォームから電話番号取得 $search_tel_num = $_POST['search_tel_num']; //フォームからの入力データを格納 $chk_data = "$search_id,$search_user_name,$search_home_address,$search_tel_num"; //比較する列名配列変更用カウント変数 $i = 0; //比較する列名 $chk_db_line = array("id", "user_name", "home_address", "tel_num"); //データベース列名格納 $all_data = "id,user_name,home_address,tel_num"; //ユーザーが入力した検索項目をカンマ区切りで配列に格納 foreach($chk_line as $chk_ln){ //ユーザーが入力した検索項目をチェック if( ($chk_ln === "") || ($chk_ln === NULL) ){ //比較する列名配列変更用カウント変数インクルメント $i++; //ユーザーが入力した検索項目をチェックし値が入っている場合 }else{ //sqlite文の$query = WHERE以降を変数に代入 //ユーザーが入力した検索項目の個数は可変のため $sqlite_str .= $chk_db_line[$i]. " LIKE ". "'%". $chk_ln. "%' "; //比較する列名配列変更用カウント変数インクルメント $i++; } } //設定項目がなければ検索しない if(!$sqlite_str){ echo "検索項目が設定されていません。"; //設定項目あれば検索する }else{ //データベースオープン if($db = sqlite_open('./db/Personal_data')){ //検索 $query = "SELECT ".$all_data ." FROM tb1_personal_data WHERE ".$sqlite_str; $result = sqlite_query($db, $query); //検索結果表示 while($info = sqlite_fetch_array($result)){ echo "<tr>"; echo "<td>氏名</td><td align='left'>{$info['user_name']} </td>"; echo "</tr>"; echo "<tr>"; echo "<td>氏名</td><td align='left'>{$info['home_address']} </td>"; echo "</tr>"; echo "<tr>"; echo "<td>氏名</td><td align='left'>{$info['tel_num']} </td>"; echo "</tr>"; } //データベースクローズ sqlite_close($db); } } とすると、単体検索は成功しましたが、複数検索を行うとエラーが表示される 検索フォームから検索 例1) 住所:埼玉県 と検索すると 山田,埼玉県********,03******** 佐々木,埼玉県********,090******** と表示される 成功 例2) 名前:山田 住所:埼玉県 と検索すると Warning: sqlite_query() [function.sqlite-query]: near "home_address": syntax error in Warning: sqlite_fetch_array() expects parameter 1 to be resource, boolean given in とエラー表示が出ます。 そもそも考え違いをしていたらすいません。 どなたかよろしくお願いします。

    • ベストアンサー
    • PHP
  • PerlでSQLiteのデータテーブルを作成し

    PerlでSQLiteのデータテーブルを作成し、作成したテーブルへデータを追加するようにしたいのですが、 下記のように作成し、実行すると、 テーブルの作成のみ、もしくは、既存のテーブルへのデータの追加のみは可能なのですが、 両方処理させると、テーブルの作成のみされて、作成されたテーブルの中身はカラのままです。 #データベースに接続 $dbh = DBI->connect("dbi:SQLite:dbname=c:\\database\\tyumon.db"); open (DATA,"c.dat"); $data = <DATA>; close(DATA); $data = $data+1; $table = "user"; $table .= $data; #テーブル作成実行 $hst = $dbh->do("CREATE TABLE '$table'(name text,area text,tel text,mail text,jikan text, hoka text)"); #レコードの追加(INSERT文の実行) $st = $dbh->do("insert into '$table' values('$data','$name','$area','$tel','$mail','$jikan','$hoka')"); 「c.dat」には、カウントされた数字が入っています。 テーブル名は「user」+カウント数字で作成しています。 データベースと、CGIの勉強を兼ねて作成しているもので、 根本的な間違いなどあるかもしれません。 どなたか、ご指摘いただければ幸いです。

    • ベストアンサー
    • CGI
  • MySQLやSQliteの中のデータ検索速度について

    ざっくりとした回答で結構ですので、データベース言語のバージョンについては、あえて記載を省きます。 環境:Apatch、Linux、PHP4、SQlite2 バージョンによって動作が異なるのであれば、その場合には適宜補足します。 なお、私はデータベース言語の知識をそれほど持っていませんので、分かりやすく記述して頂けると大変助かります。 --------------------------- では、本題に移らせて頂きます。 現在、PHP4とSQlite2の組み合わせでスクリプトを制作中なのですが、 その際に、データベース(以下、DB)の中のデータを検索・抽出することがあります。 SQliteのコマンドでは、SELECT文を使った記述になります。 (恐らく、MySQLなどでも同様だと思います。) で、知りたいことは、 DBをどう構築したら、「検索・抽出」速度が遅くなりにくいか(高速になりやすいか)。 これが知りたいわけです。 私が考えている方法は、いくつかあって、それらについて、 速い遅いの意見を覗いたいと思います。 また、もっと良い方法がありましたら、そちらも教えて下さい。 想定しているDBは、例として、簡単に以下のものとします。 例:学年の生徒DB クラスがA組~E組まで5クラスあります。 生徒の、 氏名、性別、クラス、出席番号、生年月日、所属している部活名、担当委員、欠席数 のようなものを記録するDBだと思って下さい。 さて、この例において、以下のどの形式が良さそうでしょうか。 方法1: (DBファイルを1つ用意) DBをCREATEするときに、TABLE名を tbl_all という風に1学年全体で記録するような形式。 方法2: (DBファイルを1つ用意) DBをCREATEするときに、TABLE名を tbl_a ~ tbl_e という風に分け、それぞれのテーブルに各クラスの生徒データを記録するような形式。 方法3: (DBファイルを複数用意) DBをCREATEするときに、クラスごとに、DBファイルを「db_a.sqlite2」~「db_e.sqlite2」のように作成し、それぞれにおいて、TABLEを1つ作り、そこにクラス内の生徒のデータを記録する形式。 どの形式のDBが、速く(もちろん正確に)検索・抽出(SELECT)できるでしょうか。 一般論でも結構です。 また、データ数が多くなるにつれ、速度が逆転するというような場合には、そちらも教えて下さい。 この例では、クラス数が5なので、比較的データは少ないですが、 私が構築しようとしているDBでは、データを1万件以上扱う可能性が高いので、その点も考慮して、アドバイスして頂けると嬉しいです。 以上、よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • SQLiteによる相関副問い合わせ

    SQLiteによる相関副問い合わせ SQLiteのデータベースについて質問です。 以下のような、商品データベースと、その商品の色に関するデータベースを持っています。 【テーブル head 】 帽子のデータベース name | 値段 | 季節 ------------------------- シルクハットA | 3980 | 春 シルクハットB | 2980 | 夏 キャップA | 1980 | 春 【テーブル color 】 name | color | 配合率 ------------------------- シルクハットA | 赤 | 80 シルクハットA | 白 | 20 シルクハットB | 黄 | 40 シルクハットB | 黒 | 60 キャップA | 青 | 30 キャップA | 黒 | 70 上記のデータベースから黒を含む商品の名前と値段を出力しようと以下の構文を実行しました。 SELECT * FROM head AS H WHERE EXISTS ( SELECT * FROM color WHERE H.name = name AND color = '黒' ) 上記で「Error: near "SELECT": syntax error」になってしまいました。どこが間違っているのでしょうか?