2009-08-24 8 views
0
コマンドが何をすべき

Unixのパイプのような正規表現とネストされたクエリ何か:要するにのPostgres:

user_id | username | email |   passhash_md5   | logged_in | has_been_sent_a_moderator_message | was_last_checked_by_moderator_at_time | a_moderator 
---------+----------+-----------+----------------------------------+-----------+-----------------------------------+---------------------------------------+------------- 
     9 | he  | [email protected] | 6f96cfdfe5ccc627cadf24b41725caa4 |   0 |         1 | 2009-08-23 19:16:46.316272   | 

:パターン「*@he.comは」見出しを除く行にある場合はが出力として1を与えます、私は多くのSELECTコマンドをUnixパイプのようにRegexと接続したいと思っています。上記の出力はSELECTコマンドからのものです。新しいSELECTコマンドをパターンにマッチしてくれ1.

Related

+1

おそらく、達成したいことを説明できますか?あなたが示したスニペットから、私はあなたが得たいものは何か分かりません。 –

答えて

1

を与える必要がありますあなたは

SELECT regexp_matches((SELECT whatevername FROM users WHERE username='masi'), 'masi');

をもしかしてあなたは明らかにregexp_matchesにレコード(*)を養うことはできませんが、私はこれを仮定あなたの問題が何であるかは、あなたがその件名にSQLクエリーを入れ子にするという問題に言及しているからです。

はたぶん、あなたはあなたのサブクエリが複数の結果が得られた場合の

SELECT regexp_matches(wn, 'masi') FROM (SELECT whatevername AS wn FROM users WHERE username LIKE '%masi%') AS sq;

のようなものを意味しました。

+0

あなたはおそらくリグです。 "ERROR:サブクエリは最初のコマンドで1つのカラムだけを返す必要があります" –

+0

サブクエリ 'SELECT whatevername'は複数のカラムを返さないかもしれないので、そこに' * 'は残っていると思います。あるいは、「最初の命令」の意味は何ですか? –

+0

本当ですか?私はそれをコマンド "SELECT regexp_matches((SELECT * FROM users WHERE username = 'he')、 '* he.com');でテストしました;質問に追加されたテーブルに。 –

1

あなたは電子メールアドレスに一致する正規表現のクエリを使用することができますように見えます:一致がある場合は、このクエリから1を返すに

select * from table where email ~ '.*@he.com'; 

select distinct 1 from table where email ~ '.*@he.com'; 

これが返されます一致するものがある場合は1の列を含む単一の行、そうでない場合はまったく行がありません。このようなクエリを構成する他の多くの方法があります。

+0

?列? ---------- (1行) –

+0

1以外にメタデータを取得するのはなぜですか? Postgresでフィルタリングすることは可能ですか? –

+1

あなたは列ヘッダーを意味しますか? psqlのシェルを使っていると言うことができる限り、おそらく 'psql -t'オプション(タプルのみ)が求められます。 –

1

のは、元のクエリがあるとしましょう:

select * from users where is_active = true; 

そして、あなた本当には、(多くの理由のために悪い考えである)任意の列に一致させたい、とあなただけかどうかを確認したいこと"* @he.com"はどんな行にもマッチします(ちなみにこれは正しい正規表現ではありません!正しい@ * he.comですが、アンカー(^または$)がないので、@ he.com

select 1 from (
    select * from users where is_active = true 
) as x 
where textin(record_out(x)) ~ '@he.com' 
limit 1; 

もちろん、すべての列を選択することもできます。

select * from (
    select * from users where is_active = true 
) as x 
where textin(record_out(x)) ~ '@he.com' 
limit 1;