2017-03-16 3 views
1

postgresで複雑なパターンマッチングクエリを作成する際に問題が少しあります。私はいくつかのアドバイスをしたいと思います。複雑なpostgresqlパターンの一致

私は、アイテムコードと周り55Kレジストリ、彼らは次のルールを持っていたパターンを持つテーブルを持っている:

  1. 常に文字でCNFを起動する必要があります
  2. 以下のスペースがなければなりません」 CNF」手紙
  3. スペースは、第二の空間が他のSEを来た後に、この最初のシーケンスは、別のスペース
  4. が来た後は常に8つの数字
  5. でなければならない数列を来た後、任意の数の数字を持つことができます。

はここにいくつか例を示します。

"CNF 56500155 99" 
"CNF 51100039 3666" 
"CNF 51100090 0985" 
"CNF 52300021 07" 
"CNF 52300020 4602" 
"CNF 56700091 2515" 
"CNF 56700091 387" 
"CNF 56700091 4784" 
"CNF 56500155 2066" 
"CNF 56900149 6266" 
"CNF 56300009 175" 
"CNF 56700091 4782" 
"CNF 51100084 2445" 
"CNF 51100062 2379" 
"CNF 52900014 0920" 
"CNF 51100077 707" 
"CNF 51100077 9706" 
"CNF 51100101 6580" 
"CNF 51500014 8929" 
"CNF 56700091 79" 
"CNF 51100090 8510" 
"CNF 51100090 8508" 
"CNF 51100090 8506" 
"CNF 56700091 4774" 
"CNF 51100101 9879" 
"CNF 51100077 696" 
"CNF 51100004 5083" 
"CNF 56700091 4773" 
"CNF 56500155 8616" 
"CNF 51100039 324523423" 
"CNF 51100090 5786" 
"CNF 56700091 771" 
"CNF 51100077 9692" 
"CNF 51100077 9691" 
"CNF 51500014 18928" 
"CNF 56700091 24770" 
"CNF 51100077 9685" 

は、私は次のような問題はなく、所望のパターンを持つことができますすべてのレジストリを取得するためにパターンマッチクエリを作りたいです。

"CNF56500155 99" <-- No space between CNF and first sequence 
    "CNF 51100039 3666" <-- Double or more spaces between CNF and first sequence 
    "CNF 511000900985" <-- No space between first and second sequences 
    "CNF 52300021  07" <-- Double or more spaces between first and second sequences 
    "CNF 523000 07" <-- Less that eight numbers on the first sequence 

私は括弧内のワイルドカード文字を使用して異なるquerysを試してみたが、正しいものを見つけることができないよう、誰も私を助けてくださいだろうか?

答えて

1

コードは、正規表現パターン^CNF \d{8} \d+$と一致する必要がありますので、あなたは、このパターンに一致しないすべての行、例えば:

with codes(code) as (
values 
    ('CNF 51100077 9692'), 
    ('CNF 51100077 9691'), 
    ('CNF 51500014 18928'), 
    ('CNF 56700091 24770'), 
    ('CNF 51100077 9685'), 
    ('CNF56500155 99'), 
    ('CNF 51100039 3666'), 
    ('CNF 511000900985'), 
    ('CNF 52300021  07'), 
    ('CNF 523000 07') 
) 

select code 
from codes 
where code !~ '^CNF \d{8} \d+$'; 

     code   
--------------------- 
CNF56500155 99 
CNF 51100039 3666 
CNF 511000900985 
CNF 52300021  07 
CNF 523000 07 
(5 rows)  

Read about pattern matching with regular expressions.


補遺を選択する必要があります。テーブルにチェック制約を使用すると、パターンと矛盾するデータを挿入することを防ぐことができます。

create table my_table (
    id int primary key, 
    code text 
); 

-- note that you can add this check constraint 
-- only if there are no rows which violate the condition 
alter table my_table add check (code ~ '^CNF \d{8} \d+$'); 

insert into my_table 
values (1, 'CNF 523000 07'); 

ERROR: new row for relation "my_table" violates check constraint "my_table_code_check" 
DETAIL: Failing row contains (1, CNF 523000 07). 
+0

これはまさに私が探していたものです。どうもありがとうございました。 :D – Omaruchan

関連する問題