• 締切済み

DBIでメールアドレスにマッチさせてselect

質問させてください。 PERL、DBI、MYSQL5でメールアドレスにマッチさせてデータを呼び出したいのですが動きません。 下記の(1)では動くのですが、(2)になるとダメになります。 ■(1) #$noには'1'が入っています。 my $query = "select * from TABLE_NAME where no = $no "; ■(2) #$mailには'test@test.com'が入っています my $query = "select * from TABLE_NAME where mail = $mail"; SQL文以外の部分は過去正常に動いているので問題無いと思います。 今回メールアドレスでwhereするというのが初めてですので、 なにかその部分でダメになっているのではと考えています。 ちなみに直接書いた場合(以下)は正常に動きます。 my $query = "select * from TABLE_NAME where mail = test\@test\.com"; なぜでしょう… 検索しても全く原因がわかりませんでした。 分かる方いらっしゃいましたらご回答いただければ幸いです。 よろしくお願いします。

  • Perl
  • 回答数1
  • ありがとう数8

みんなの回答

回答No.1

テーブル上でメール部分は文字列で定義していると思いますが、 SQL ではシングルクォー テーションでくくったものが文字列となります。つまり、 select * from TABLE_NAME where mail = 'test@test.com'; という SQL を渡さなければなりません。 (以下、表示がくずれるの 1 バイトのスペースを全角のスペースにしていることに注意) #!/usr/bin/perl use strict; use warnings; use DBI; my $db_name = 'sqlite_test.db'; unlink $db_name; my $dbh = DBI->connect(   'dbi:SQLite:dbname=' . $db_name,   '', '',   {  AutoCommit => 0,     RaiseError => 1   } ) || die "$db_name : $!"; my $sql; my $table = 'user_info'; print '--- Create Table', "\n"; $sql   = 'CREATE TABLE '   . $table   . '(id integer primary key, name string, mail string)'; $dbh->do($sql); $dbh->commit; my $sth; print '--- Insert Record', "\n"; $sth = $dbh->prepare(   'INSERT INTO ' . $table . '(id, name, mail) VALUES (?, ?, ?)' ); $sth->bind_param( 1, '1' ); $sth->bind_param( 2, 'user' ); $sth->bind_param( 3, 'user@xxx' ); $sth->execute; $dbh->commit; print '--- Select Record', "\n"; my $mail    = 'user@xxx'; my $quote_mail = $dbh->quote($mail); $sql = "select * from $table where mail=$quote_mail;"; print $sql, "\n"; # select * from user_info where mail='user@xxx'; $sth = $dbh->prepare($sql); $sth->execute; while ( my $ref = $sth->fetch() ) {   for my $array_ref (@$ref) {     print "$array_ref\n";   } } $sth->finish(); $dbh->disconnect; unlink $db_name;

関連するQ&A

  • select max~の値の取得方法

    select Max(x) from table where y=1 基本的なことかもしれませんが、上のようなクエリを実行したときの値の取得の仕方を教えてください。 単純に query="select Max(x) from table where y=1" a=Execute query としたら「ステートメントの末尾が不正です。」というエラーが出ました。

  • SELECTを含むUPDATEについて

    2つののテーブルがあり、テーブル1のデータを元にテーブル2を更新させたい場合、SELECT文を含むUPDATE文で更新出来ると思うのですが、どのようにしたら一番効率的でしょうか? 例)テーブル1~table1 no ken city ---------------------------------- 01 北海道 根室 03 青森 八戸 05 千葉 柏 08 埼玉 さいたま 09 東京 千代田区 例)テーブル2~table2 no ken city ---------------------------------- 01 02 03 04 05 06 07 08 09 テーブルが2つあり、テーブル1の情報を元にテーブル2を更新したい。 条件は、noが一致していること。 A) kenを更新するには、 ↓ UPDATE `table2` SET ken = (SELECT ken from table1 WHERE table1.no = table2.no) B) kenとcityを更新するには、 ↓ UPDATE `table2` SET ken = (SELECT ken from table1 WHERE table1.no = table2.no), city = (SELECT city from table1 WHERE table1.no = table2.no) SELECT以下が同じなのでもうちょっとスマートに短く記述する方法はあるんでしょうか?

    • ベストアンサー
    • MySQL
  • Mysqlの接続について

    現在、以下のようなperlのスクリプトを作っているのですが、mysqlへの接続,切断は以下の場合、どちらにした方がいいのでしょうか? (1)の場合 use DBI; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth = $dbh->prepare("SELECT no,title,name,date,host From `table1` where no='1'"); $sth->execute; $sth->fetchrow_array; $sth->finish; $sth2 = $dbh->prepare("SELECT no,title,name,date,host From `table2` where no='1'"); $sth2->execute; $sth2->fetchrow_array; $sth2->finish; $dbh->disconnect; (2)の場合 use DBI; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth = $dbh->prepare("SELECT no,title,name,date,host From `table1` where no='1'"); $sth->execute; $sth->fetchrow_array; $sth->finish; $dbh->disconnect; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth2 = $dbh->prepare("SELECT no,title,name,date,host From `table2` where no='1'"); $sth2->execute; $sth2->fetchrow_array; $sth2->finish; $dbh->disconnect; (1)の場合と(2)の場合の違いは、(1)の場合、最初にデータベースに接続して、一番最後に切断する事で、(2)の場合、毎回データベースへの接続と切断を行う事が違います。 (2)の場合、毎回接続と切断を行うので、2回ほどではあまり変わらないかもしれないのですが、もし10回とか接続と切断を行うとかなり負荷が高くなるような気がするのですが、他のHPなどを拝見すると接続をしたら切断を行うように癖をつけるようにした方がいいと書かれていたりします。 どちらの方が正しいやり方というか、負荷がすくなく使えるのでしょうか?

    • ベストアンサー
    • Perl
  • カウント結果を1レコードの中で横に並べたい

    カウント結果を1レコードの中で横に並べたい 以下のテーブルを、 test_table id   group  name 1    100   テスト1 2    100   テスト1 3    100   テスト1 4    200   テスト1 5    200   テスト1 6    200   テスト2 7    200   テスト2 8    200   テスト2 9    200   テスト2 nameごとのカウント、更に100だけのカウント、200だけのカウントといったように、 以下のように横に並べることは可能でしょうか? name   合計  100計   200計 テスト1  5    3      2 テスト2  4    0      4 まず、nameごとの合計を取得するクエリを作って、 それに、100計列、200計列の部分をサブクエリでもってきたのですが、 これで動くには動くんですが、このやり方しかないものでしょうか。 ご教示おねがいします。 SELECT t.name, COUNT(*) as '合計', (SELECT COUNT(*) FROM test_table as t1 WHERE t1.name = t.name AND t1.group = '100' ) as '100計', (SELECT COUNT(*) FROM test_table as t1 WHERE t1.name = t.name AND t1.group = '200' ) as '200計' FROM test_table as t WHERE 1 GROUP BY t.name;

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

    以下のように、データの存在と共に名前まで一度に取得 できるクエリの書き方って存在しますか? select count(*), namae from a_class where no='1'; 通常は select count(*) from a_class where no='1'; として、1件ならば、 select namae from a_class where no='1'; で取得しますが。 DBはPostgreSQLです。perlのDBIを利用しています。

  • inner joinとwhereでの結合の違いは?

    お世話になります。 たとえば、テーブルが複数(この場合2つ)ある場合。 (1) test(カラム:table_id,table_name) (2) tester(カラム:table_id,table_name) 以下のクエリは条件的に select a.table_id, a.table_name from test a inner join tester b on a.table_id = b.table_id ************* select a.table_id, a.table_name from test a , tester b where a.table_id = b.table_id 同じですよね? パフォーマンス的にもjoinすることのメリットが判りません。

  • PerlでDBIを使いますが、結果セットをフィールド名でアクセスするには?

    OSはWindowsでAccess2002のデータベースをODBC経由でDBIを用いて、Perlからアクセスします。 以下のように、結果セットをフィールド名でアクセスしたいです。 可能でしょうか? #!/perl/bin/perl #!/usr/bin/perl -w use DBI; # create the DSN connection $dsn = "dbi:odbc:test"; $dbh = DBI->connect($dsn) or die "接続エラー"; $query = "select * from goods;"; # execute the query $sth = $dbh->prepare($query); $sth->execute(); print "no name price\n"; print "--------------------------------------\n"; while(@item = $sth-> fetchrow) { #print "@item[0] @item[1] @item[2]"; #----- 通常はこうだが、 print "$item{'goods_name'} $item{'goods_price'} $item{'auto_no'}"; #----こんな感じで利用したい。 print ("\n"); } # disconnect $sth->finish(); $dbh->disconnect(); exit; __END__

    • ベストアンサー
    • CGI
  • Perl DBI でSELECT ilikeの結果がうまくでない

    入力したワードを含む商品の列挙をしたいのですけどpsqlで直接たたくとうまく結果がでるのにPerlからDBIを使用した場合は入力ワードによってうまくできたりできなかったりします。どうしたらうまくいくのでしょうか? DBはEUC-JP PerlからのクエリーもEUCにJcode変換してから行っております。 なおうまく出ないのは漢字ではなく英数字をワードにしたものです。 SELECT * FROM 商品テーブル WHERE 商品名 ilike '%入力ワード%' 商品名が**** A-101ABXの場合 '%A-%'ではうまくいくけど'%A-101BX%'ではうまくいかない。 (****は任意の漢字、英数字) どうぞよろしくお願いします。

  • 複雑なcountについて

    val | num ----------- 9984 | 1 1234 | 1 9876 | 1 4567 | 1 9984 | 1 1234 | 1 9984 | 1 以上のようなテーブルで SELECT COUNT(*) FROM table_name WHERE val = 9984 SELECT COUNT(*) FROM table_name WHERE val = 1234 SELECT COUNT(*) FROM table_name WHERE val = 9876 SELECT COUNT(*) FROM table_name WHERE val = 4567 のように4つ実行することなく1度に 9984 => 3 1234 => 2 9876 => 1 4567 => 1 という結果を得たいのですが方法はありますでしょうか? ご教示お願いいたします。

  • 複雑な条件下におけるupdate文について

    sqlserver(2008R2)についてクエリ文が上手く書けません。 お手数をおかけいたしますが、お分かりになる方はご教授いただければと 思います。 まず、元となるテーブルおよび作成したい完成系は添付ファイルをご確認下さい。 personal_id、personal_name、personal_address、personal_tel、personal_date列を 持つテーブル(personal_table)から 「select * into #table01 personal_table」に よって一時テーブル#table01を作成し、personal_name・address・telがnullの場合に、 personal_dateが直前時におけるnull以外の値をセットしたいと思っています。 (ただし、セットするのはpersonal_id毎で、最もpersonal_dateが若い者には 必ずpersonal_name・address・telが入っているものとします)。 なお、以下は私が作成したクエリになります。 項目1つずつっと思い、 とりあえずpersonal_nameをpersona_idおよびpersonal_dateを用いて updateしようと思ったのですが、personal_nameがすべてnullになってしまいました。 --------------------------- select * into #table01 from personal_table update #table01 set personal_name = (select personal_name from #table01 A where #table01.personal_id = A.personal_id AND #table01.personal_date = (select MAX(A.personal_date) from #table01 A where #table01.personal_date > A.personal_date AND #table01.personal_id = A.personal_id)) SELECT * from #table01 --------------------------- 完成系を作成するにあたってどのようなクエリを書けばよろしいのか、 ご教授いただければと思います。