1

さまざまなマシンからデータを自動的に収集するPostgresql9.2DB。DBには、マシンID、ファームウェア、メーカーIDなどのすべてのデータと、実際の結果データが格納されます。1つの格納されたフィールド(varchar)には、^文字で区切られた5つのサブフィールドがあります。

ACT18!!!8246-EN-2.00013151!1^7.00^F5260046959^H1P1O1R1C1Q1L1^1 (Machine 1)

このデータの順序は、マシンごとに異なるようです。例:マシン1 2および3。上の文字列はファームウェアバージョン(この場合は「7.0」)を示し、サブフィールド2に表示されます。ただし、別のマシンが別のサブフィールド(この場合はサブフィールド)にデータを送信します。 3で、値は「1」です。

BACT/ALERT^A.00^1^^ (Machine 2)

CREATE TRIGGER t_machine_id AFTER INSERT関数を使用して、別のテーブルの別のフィールドに値「7.0」と「1」を格納します。この関数では、データの取得元のマシンに応じて、使用するサブフィールドを選択できます。

split_partこれを行うのに最適な機能はありますか?誰かがこれを行うサンプルコードを提供できますか?ドキュメントに何も見つかりません。

4

1 に答える 1

0

(a)次のようなものを使用してデータを分割する必要がありますregexp_split_to_table(b)依存するフィールドの位置順序がないため、いくつかの基準を使用してどの部分がどの部分であるかを一致させます。現在、ファームウェアのバージョンとマシン番号を決定するための信頼できるルールはありません。where field <> machine_numberマシン1にファームウェアバージョンがある場合、結果が得られないため、実際には言えません1

与えられたダミーデータ:

CREATE TABLE machine_info(data text, machine_no integer);
INSERT INTO machine_info(data,machine_no) (VALUES
  ('ACT18!!!8246-EN-2.00013151!1^7.00^F5260046959^H1P1O1R1C1Q1L1^1',1),
  ('BACT/ALERT^A.00^1^^',2)
);

何かのようなもの:

SELECT machine_no, regexp_split_to_table(data,'\^') 
FROM machine_info;

マシン番号付きの分割データ要素のテーブルが表示されますが、次に、どのフィールドがどのフィールドであるかを決定する必要があります。

 machine_no |    regexp_split_to_table     
------------+------------------------------
          1 | ACT18!!!8246-EN-2.00013151!1
          1 | 7.00
          1 | F5260046959
          1 | H1P1O1R1C1Q1L1
          1 | 1
          2 | BACT/ALERT
          2 | A.00
          2 | 1
          2 | 
          2 | 
(10 rows)

regexp_split_to_arrayフィールドの順序から有用な情報を取得できるかどうか、およびデータをどのように処理するかによっては、置換の出力がより役立つ場合があります。

regress=# SELECT machine_no, regexp_split_to_array(data,'\^') 
          FROM machine_info;
 machine_no |                      regexp_split_to_array                       
------------+------------------------------------------------------------------
          1 | {ACT18!!!8246-EN-2.00013151!1,7.00,F5260046959,H1P1O1R1C1Q1L1,1}
          2 | {BACT/ALERT,A.00,1,"",""}
(2 rows)

2つのファームウェアバージョンがあるとします。バージョン1は送信code^blah^fwvers^^し、バージョン2以降は送信しますcode^fwvers^blah^blah2^machineno。バージョン1では最後の2つのフィールドが空白のままであることがわかっているため、2つを区別できます。

SELECT
  machine_no,
  CASE WHEN info_arr[4:5] = ARRAY['',''] THEN info_arr[3] ELSE info_arr[2] END AS fw_vers
FROM (
  SELECT machine_no, regexp_split_to_array(data,'\^')
  FROM machine_info
) string_parts(machine_no, info_arr);

結果:

 machine_no | fw_vers 
------------+---------
          1 | 7.00
          2 | 1
(2 rows)

もちろん、提供したサンプルデータは2つだけなので、実際のマッチングルールはより複雑になる可能性があります。目的のフィールドを抽出し、渡された配列からそれらを返すSQL関数を作成することを検討してください。

于 2012-10-23T08:36:07.733 に答える