2011-09-14 12 views
0

ポストグルSQLの作業。クイックSQLの質問

私は、次の形式の値を含む列を持つテーブルがある:

セット1/SET2/SET3/...

セティは、各iに対する値のセットすることができます。それらは '/'で区切られています。

私は、set1/set2という形式の別個のエントリを表示したいと思います。これらのエントリの残りの文字列を切り捨てるか、切り捨てたいと思います。偉大な仕事と

セット1/SET2

正規表現:ある は、私がのために、すべての異なるオプションをしたい私は、パターンの部分文字列をしたい:。*/*/

が表示されます。それ以外の部分はありません。

table_nameの

は異なるCOLUMN_NAMEを選択するが、私は自分自身をトリミング作り方見当がつかない:

私は限りです。

w3schoolsや他のサイトを調べて、SQL trim/SQLをGoogleで検索してみましたが、探しているものが見つかりませんでした。

ありがとうございます。

+0

タイトルを意味のあるものに変更することをお勧めします。 –

答えて

1

実際にそのような場合は、substringを使用できます。例えば:

=> select substring('Set1/Set2/Set3/' from 1 for 9); 
substring 
----------- 
Set1/Set2 
(1 row) 

あなたがもう少し柔軟性が必要な場合は、POSIX正規表現を理解substringのバージョンもあります。

http://www.postgresql.org/docs/current/static/index.html

と言っても、使用可能なインデックスと賢明なナビゲーションを持っています

PostgreSQLのオンラインドキュメントは、BTWかなり良いです。


あなたが.*/.*を使用したい場合、あなたは、たとえば、substring(s from '[^/]+/[^/]+')ような何かをしたいと思います:

=> select substring('where/is/pancakes/house?' from '[^/]+/[^/]+'); 
substring 
----------- 
where/is 
(1 row) 
+0

+1マニュアルへのリンク –

+0

いいえ、それは定期的ではありません。 Set1は、2のセットだけでなく1組の値でも構いません。これらは '/'で区切られています。/* * /。*/ –

+0

@Lost_DM:私の更新のように '[^ /] +/[^ /] +'がほしいと思うかもしれません。 –

2

ムーはスラッシュの間で文字列の長さがあればの短すぎる答えは罰金です常に一貫している。それ以外の場合は、部分文字列関数で正規表現を使用することになります。例えば

=> select substring('Set1/Set2/Set3/' from '^[^/]+/[^/]+'); 
substring 
----------- 
Set1/Set2 
(1 row) 

=> select substring('Set123/Set24/Set3/' from '^[^/]+/[^/]+'); 
    substring 
-------------- 
Set123/Set24 
(1 row) 

だから、テーブル上のクエリはなる:

select distinct substring(column_name from '^[^/]+/[^/]+') from table_name; 

関連ドキュメントがhttp://www.postgresql.org/docs/8.4/static/functions-string.htmlhttp://www.postgresql.org/docs/8.4/static/functions-matching.htmlです。

2

なぜ、複数の値を1つのレコードに格納しますか?複数のレコードで複数の値を使用することをお勧めします。問題はもう存在しません。

TEXTの代わりにTEXT[] array-datatypeを使用すると、値の配列を使用することもできます。 GIN-indexを使用して配列フィールドのインデックスを作成できます。 (mu_is_too_shortがお見せしたような)

SUBSTRING()アレイを使用して、現在の問題を解決し、array functionsは別のオプションであることができます。

SELECT array_to_string( (string_to_array( 'セット1/SET2/SET3 /' 、 '/'))[1:2]、 '/');

これにより、柔軟性が増し、固定長の値は必要ありません。配列関数の区切り文字はジョブを行います。 [1:2]は配列の最初の2スライスを選択し、[1:3]はスライス1〜3を選択します。これにより、変更が容易になります。