(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関数を作成することを検討してください。