• 締切済み

postgreSQLの正規表現

いつもお世話になってますurizakaです。 さて、現在postgreSQL7.1(環境はLinux、言語はJava)を使ってツールを作って いるのですが、その中でIPアドレスとそのドメインを入力したテーブルm_hostが あるのですが(以下のような内容のデータが入っています) ip domein 128.155.35.42 http://www.sample.ne.jp 128.166.34.69 http://www.sando.com/index.html 199.231.12.36 http://paoo.co.jp/search?q=axieosenoe これらのテーブルから、domeinの「http://」の後で、次の「/」までの部分で、 最後の文字部分がjpのものが何件あるか?といったデータを集計したいの ですが、これはどのようにすればよいのでしょうか?JavaやVBだったら、 「/」で区切った後に、「.」で区切って最後の配列の要素を…といったプログラム を組むのですが、なるべくDB側で処理してしまいたいのです。 postgreSQLには正規表現の機能があるそうなので、それを使って結果を集計 できればと思うのですが… すみませんが、宜しくお願いします。

みんなの回答

  • kusukusu
  • ベストアンサー率38% (141/363)
回答No.2

jp|com|net 3|5|7 ↑こんな形じゃ駄目ですか? SELECT (SELECT COUNT(domain) from table_name where domain~'^http://[^/]*\.jp/') AS jp, (SELECT COUNT(domain) from table_name where domain~'^http://[^/]*\.com/') AS com, (SELECT COUNT(domain) from table_name where domain~'^http://[^/]*\.com/') AS net;

urizaka
質問者

お礼

urizakaです。 皆さん返事が遅れてすみません。 さて、今回の件ですが、なるべくSQL一文で済ませてプログラムの方の メンテナンスを容易に・・・と考えたのですが、どうもこれはプログラム側 で解決した方が良いようです。(登録から時間が経ったデータは検索がし易い ようにストアドプロシジャーに生成させて、検索専用の別のテーブルに まとめて収めるとして) そこで、kusukusuさんのいうようなSQL文をプログラムに自動生成させて、 それで検索を行うことにします。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

演算子 ~ (チルダ) を正規表現にマッチするかどうかに使います。 「正規表現」については分かりますか? > domeinの「http://」の後で、次の「/」までの部分で、 > 最後の文字部分がjpのもの は、正規表現で表すと、'^http://[^/]*\.jp/' になるはずです。 これで引っ掛けて domain をとるのであれば、 select domain where domain ~ '^http://[^/]*\.jp/' という感じかな。件数だけでよければ count を使えば良いですね。 # domein ではなく domain ね :-)

urizaka
質問者

補足

urizakaです。ご返答ありがとうございます。 domeinではなくdomainですよね、つい間違えてしまいました… 正規表現については、まだあまりよく分かりません。SQL文との組み合わせ という点では、皆目使い方が検討がつかない状態です。 さて、上記の件ですが、すみません、質問の書き方が悪かったです。 私が集計したいのは *****ip*****|*****domein********** -------------------------------------------------- 191.35.166.1| http://www.mosuko.com 192.36.155.1| http://www.itirou.co.jp/q=1111 192.35.155.1| http://www.fireman.co.jp/index とかあった時に、ドメインに.comがついているデータは何件あるか?、 .jpがついているデータは何件あるか、という一覧表です。 例) ****domein****|***count**** ---------------------------- .jp | 10 .com | 20 .net | 10 ↑このようなデータです。顧客リストDBのメールアドレスのドメインについて 調査するアプリケーションを作っているので… こういったデータはSQL文で集計できるのでしょうか?あるいはストアドプロシ ジャーを使うとか… すみません、宜しくお願いします。

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

関連するQ&A

  • PHPとPostgreSQLがつながらない

    PHPとPostgreSQLの初心者です。PHPとPostgreSQLを 使ってプログラムを作ろうと思ってます。 開発はPC上で、PostgreとPHPサーバはLinuxマシンに あります。まず最初にPostgreのインストールですが、 Fedora Core5 に着いていたPotsgreSQL8.1.3を入れ ました。設定としては、 postgresql.confでは listen_address='localhost,192.168.1.3' としました。192.168.1.3はLinuxマシンのローカル アドレスです。 pg_hba.confではconnectionのところで host all all 192.168.1.3 255.255.255.0 tyust としました。その後 host all all 0.0.0.0 255.255.255.0 tyust とかいろいろ試してみました。 一方PHPの方はほとんど何も設定をしていません。と いうか設定方法がよくわかりません。 以上の環境で、簡単なPHPプログラムをPostgreにつなげないで実行したところ問題なく動きました。 20行くらいのPHPを書いてみましたが、特に問題はあ りませんでした。 PostgreSQLの方は、PCからSSHで入って、接続テスト 用のDBを作り、テーブルも3つ作って、データを数件 Insertしました。 いよいよPHPからDBにつなぐことになったのですが、 プログラム上では以下のように書きました。 <?php    print "こんにちは"; $conn = pg_connect ('host=192.168.1.3 port=5432 dbname=phptest user=postgres');    print "こんばんは"; if (!$conn) { print "PostgreSQLへの接続に失敗です"; exit(); } else ・ ・ して実行したところ、「こんにちは」は表示されま したが、「こんばんは」以下はは表示しませんで した。$conn の先には進んでいないようです。 当然ここに書いた以外にも設定を変えてみましたが、 つながりませんでした。よろしくお願いします。

    • 締切済み
    • PHP
  • PostgreSQLサーバー。

    今回、自宅でプログラミングの勉強をする上で、DBの課題ができ、PostgreSQLをインストールできずに困っています。 課題といたしましては→テーブルを作成し、そのテーブルに対して検索した結果を表示するServletを作成することです。 そして、サンプルデータをAccessに置き、PostgreSQLとAccessをODBCで繋ぐ事です。 その第1段階といたしまして、PostgreSQLをWebサーバーにインストールする事です。  自分でも、HPなどで結構調べたのですが、自分の環境の、 OS----------------Win98 Webサーバー ------JRun に合う、PostgreSQLサーバーが探し出せないのです。 どなたか、詳しい方宜しくお願いします。

  • ExcelにPostgreSQLのデータを取り込むには

    以下のサイトを参考にして、ODBC接続によるExcelへのPostgreSQLデータ取り込みを試みました。 「PostgreSQL ODBCによるアプリケーション接続」 http://allabout.co.jp/internet/database/closeup/CU20050219A/index.htm 「2. ExcelにPostgreSQLのテーブルのデータを取り込む手順」 http://allabout.co.jp/internet/database/closeup/CU20050219A/index2.htm ODBCの設定自体はたぶんうまくいったと思うのですが、いざExcelからPostgreSQLを取り込もうとすると、「このデータソースには表示できるテーブルがありません」というメッセージが表示されてしまいます。 接続先のDBには、テーブルは存在しています。 試しに、Accessでも以下のサイトの手順で試して見ましたが、「テーブルのリンク」画面に対象となるテーブルが1件も表示されません。 「3. AccessにPostgreSQLのテーブルのデータを取り込む手順」 http://allabout.co.jp/internet/database/closeup/CU20050219A/index3.htm テーブルとのリンクをはるために他にも何か設定は必要でしょうか? PostgreSQLは8.0.1、Officeは2003を使用しています。 接続は自分のPC内にあるOfficeから同じく自分のPC内にあるPostgreSQLへ接続しに行こうとしています。 よきアドバイスをいただけると助かります。 以上、よろしくお願いいたします。

  • 勤怠管理 コアタイムのデータ管理 Java & PostgreSQL

    Java+PostgreSQLを使い、勤怠管理システムを作成中です。 システムではコアタイムを複数設定でき、環境にあわせた勤怠管理が できるようにしたいです。 従業員の勤怠集計はコアタイムを基準に、早出、基本時間、遅刻、残業を 算出できるようにしたいです。 現在、DBスキーマとテーブルに対応するJavaエンティティの定義を進めて いますが、型をどのようにすれば集計が楽になるかわからず困っています。 悩んでいるのが、日付をまたいだコアタイムを設定するとき、PostgreSQLの time型では23:59を超える時刻を扱えないため、 開始 > 終了 という データを登録する必要があり、計算が複雑になることです。 考えているものとしては、2つあります。 1) PostgreSQLの型:time Javaの型:java.sql.Time 2) PostgreSQLの型:integer(分であらわす。9:00であれば、540) Javaの型:Integer(分であらわす。9:00であれば、540) 1)は前述での計算が複雑になる問題があり、2)は、やり方がスマートでは ないような気がします。 どのような定義にすれば妥当でしょうか。 アドバイスや過去の事例等あれば、ご教授下さい。

  • PostgreSQLでoidを節約する

    質問があります。 ・PostgreSQLで、oidを節約する方法はあるでしょうか(create tableでWithout OIDSを指定する以外に) ・oidはPostgreSQLが管理上使うらしいのですが、具体的にはどのぐらい消費するか、計算方法はありますでしょうか。 以下、経緯です。 PostgreSQLに大量のバイナリデータを含むデータを登録するようなシステムを作ろうとしています。現在Oracleで動作しているのですが、DBを置き換える計画です。 調べたところ、バイナリデータを入れられる型としてoidとbyteaがありました。 このうちoidは、データを直接レコードに入れるのではなく、データベース全体で一意の番号を使用してバイナリデータを管理するもののようでした。この「一意の番号」というのが4バイト(32bitOSなので)しかなく、さらにこの番号はPostgreSQLも管理上使用するようです。仮に半分がバイナリデータの識別に使えるとして、21億個までデータを入れられる計算です。 充分な数のようにも思いますが、昨今のHDD事情や(1個1KBとして21億個は約2TBです)、OracleのLOBロケーターはバイナリデータの識別だけで20バイト確保されていることと比べると、「4バイト-PostgreSQLの管理使用分」というサイズはどうも不安です。 この制約を回避するためbyteaを使うことにしました。 しかしPostgreSQLにはTOASTという仕組みがあり、データが大きいときは分割して別の仮想的なテーブルに入れられ、その管理には結局oidが使われるというではありませんか。しかもデータは2000バイトづつに分割されてそれぞれにoidが付くという「浪費」っぷりです。 有償DBと比較するのもいかがなものかとは思いますし、何事にも「無限」ということはないのですが、結局バイナリデータがどれだけ入れられるのかが知りたいです。 PostgreSQLは何にどのぐらいoidを消費するか、計算方法を教えてください。 あるいは、何か勘違いをしていましたらご指摘いただけますと助かります。

  • PostgreSQL 7.2.8 異なるデータベース間のテーブル

    こんにちは。かなり困っています、よろしくお願いします>< PostgreSQL 7.2.8 を使用しています。 一つのユーザーで、二つのデータベースがあります。 それぞれ同じカラムを持つ同じ名前のテーブルがあります。 中のデータは違います。 db1 - tableT db2 - tableT 条件を付けて、db1のtableTのデータを db2のtableTへコピーするにはどのような方法がありますか? 例えば select * from db1.tableT tbl1, db2.tableT tbl2 where tbl1.title = tbl2.title; のようにしてとりあえずselectで試してみましたがダメでした。 やはりスキーマとデータベースは違うんですね>< ドットが認識されませんでした。 どなたか解決法をご存知の方、よろしくお願いします。

  • PostgreSqlのアクセス権設定(GRANT)

    OS:RedHat9 DB:PostgreSql-7.3.2 PostgreSqlでアクセス権を設定しようと思ったのですが 下記の事で悩んでます。 ご存知の方がいましたら教えてください。 【質問】 「GRANT 権限の種類 ON テーブル名 TO 対象」の構文 だと、後から作成されたテーブルに対してまたGRANTを 行わなくてはいけないと思うのですが、面倒です。 ALLやPUBLICみたいに全テーブルを指定する方法は無い のでしょうか? ※GRANT以外の方法でも良いです。 ※出来なければ出来ないの回答でも良いです。

  • PostgreSQL MySQL CSV入出力

    テーブルのデータを移植したいと思っています PostgreSQL8.4から出力したCSVをMySQL5.5で取り込みたいのですが、COPYコマンドを使用すると以下のようなエラーが出ます ERROR 1262 (01000): Row 1 was truncated; it contained more data than there were input columns PostgreSQLはtext[]型で"{A_1,A_2}"といったデータを出力します MySQLはPostgreSQLの配列に相当する型がないようなのでBlob型で格納しようと思っています おそらくデータ内のカンマが原因なのはわかっているのですが、上手くエクスポート・インポートする方法はありませんでしょうか?

    • ベストアンサー
    • MySQL
  • PostgreSQLサーバー構築について

    おはようございます。PostgreSQLを使ったクライアントサーバーシステムの構築について 質問です。 PC(A)にPostgreSQLをサイレントインストールを行って、DBも作成し、正常にDBが起動している 状態とします。 このとき、PC(B)にODBCドライバをインストールし、ODBC接続の設定を自動で作成する部分 を作成しようと考えています。 1台のPCに入れたときにはホスト名をlocalhostとすることで問題はありませんでしたが、 ほかのマシンにインストールしたとき、どのサーバーで(どのIPで?)PosegreSQLが動いているのか クライアント側から取得する方法がありましたら、教えていただきたいと思います。 OSについてはどちらもWindows系OSを考えております。 よろしくお願いします。

  • 正規表現について教えてください。

    正規表現について教えてください。 Oracleで開発を行っている者ですが、ネットや本で調べても わからない箇所がありましたので、ここに質問として挙げさせていただきます。 ご教示いただけると幸いです。 現在、下記のようなデータが入ったテーブルがあります。 ---------------------------------------------------------------------------------- ID | SENTENCE          | REG_EXP ---------------------------------------------------------------------------------- 1 | <○○○:XXXX>      | [^<][^:]+ ---------------------------------------------------------------------------------- 2 | <○○○:XXXX>→<△△△:XXXX> | ---------------------------------------------------------------------------------- 3 | ■■■■■<○○○:XXXX> | ---------------------------------------------------------------------------------- このテーブルを使って、アプリを作っているのですが、 期待動作としては、SENTENCEの列に入っている文字列を REG_EXPの列に入っているデータ(正規表現のパターン)で マッチした文字列を切り取るようにしたいのです。 例えば、IDが1の場合は○○○が切り取られるのが期待動作です。 (注.この動作は、REGEXP_SUBSTR関数を用いてSQLで実行します。) お聞きしたいのは、IDが2の場合は△△△を、IDが3の場合は○○○を、 配列の最初の要素に入れるには、正規表現をどのように記載すればよいのか、ということです。 ○、△、■、Xの部分は英数字、日本語のどれが入るのかはわかりませんが、 <や→、:などの全角記号のフォーマットはこのままになります。。 IDが2の正規表現は[^<:→]+[^<:→]+[^<:→]+ で試してみたのですが、 うまく出来ませんでした・・・。 テーブルの線の調整がうまくできず、 表が見づらくて申し訳ありませんが、 正規表現に詳しい方、ご教示をよろしくお願いいたします。