4

Postgres の varchar フィールドからいくつかの値を取得しようとしています。*product_name* フィールドには、「Big Bag 24-0-3 Twenty Gallons」または「Small Bag 0-14-40」のようなものを含めることができ、製品コードは #-#-# です。製品コードの数字は 0 の場合もあれば、1 桁または 2 桁の場合もありますが、2 つのダッシュで区切られた 3 つの数字が常に存在します。

一致する製品が正しく返されましたが、今度は各数値を個別のフィールドに取得する必要があるため、部分文字列の返還を手伝ってくれる私よりも頭の良い人に本当に感謝しています!

この Regex Match は正しい製品を返します。

select * from products where product_name LIKE '%_-_-_%'

部分文字列を使用して製品コードを返そうとしましたが、2 桁の 3 番目の数字を持つ製品が切り捨てられています (つまり、「Big Bag 24-0-32 Foo」は「24-0-3」を返します)。

select trim(substring(name from '%#"__-_-_#"%' for '#')),* 
from products where name LIKE '%_-_-_%'

とにかく、整数だけではあまり役に立ちません。3 つの数値のそれぞれを別々の部分文字列に抽出する必要があります。

4

2 に答える 2

7

1 つのオプションはregexp_matches、コードを抽出するために使用することです。

regexp_matches(string text, pattern text [, flags text])
文字列に対して POSIX 正規表現を照合した結果、キャプチャされたすべての部分文字列を返します。

そしてregexp_split_to_array

regexp_split_to_array(string text, pattern text [, flags text ])
区切り文字として POSIX 正規表現を使用して文字列を分割します。

コードを数字に分解します。例えば:

=> select regexp_split_to_array((regexp_matches('Big Bag 24-0-3 Twenty Gallons', E'(\\d+-\\d+-\\d+)'))[1], '-');
 regexp_split_to_array 
-----------------------
 {24,0,3}
(1 row)

これ{24,0,3}は、関心のある 3 つの数値 (文字列として) を含む 3 つの要素の配列です。またregexp_split_to_table、配列よりも 3 行のテーブルの方が操作しやすい場合もあります。

=> select regexp_split_to_table((regexp_matches('Big Bag 24-0-3 Twenty Gallons', E'(\\d+-\\d+-\\d+)'))[1], '-');
 regexp_split_to_table 
-----------------------
 24
 0
 3
(3 rows)
于 2013-11-05T18:02:20.900 に答える
1

これはあなたが探していたほど正規表現ではありませんが、おそらくあなたを近づけるでしょう:

Select substring( arr[ 1 ] from '[0-9][0-9]*' ) as first,
    arr[ 2 ] as second,
    substring( arr[ 3 ] from '[0-9][0-9]*' ) as third
FROM
(
Select string_to_array( d1, '-' ) as arr
from
(
SELECT * FROM ( VALUES
( 1, 'Big Bag 24-0-3 Twenty Gallons' ),
( 2, 'Small Bag 0-14-40' ),
( 3, 'Big Bag 24-0-32 Foo' ),
( 4, 'Other Bag 4-4-24' )
) AS products( id, d1 )
) AS values_table
) AS get_array

おそらく、すべてのブロック AS エイリアシングなしで 1 回のパスでこれを行うより良い方法がありますが、内訳は次のとおりです。

  • VALUES テーブルはテスト データを提供します。d1 は取得するデータです。
  • これは、string_to_array() で解析され、 、 、および(自動入力されます) の-ような部分文字列を取得して配列します。Big Bag 2403 Twenty Gallons
  • 外側の select は、最初と最後の配列要素から数値を選択するだけで配列値を変換します。

この種の作業は、各数値を取得する関数に入れることができますが、NULL テストなどを取得する必要があります。

于 2013-11-05T18:02:17.390 に答える