我有一张桌子:
CREATE TABLE "text_file"
( "SEQ" NUMBER,
"SPLIT_VALUE" CLOB
)
表的内容是:
SEQ SPLIT_VALUE
1 MSH|^~\&|GHH LAB|ELAB-3|GHH OE|BLDG4|200202150930||ORU^R01
PID|||555-44-4444||EVERYWOMAN^EVE^E^^^^L|JONES|19620320|F|||153 FERNWOOD DR.^^STATESVILLE^OH^35292|
OBR|1|845439^GHH OE|1045813^GHH LAB|15545^GLUCOSE|||200202150730
OBX|1|SN|1554-5^GLUCOSE^POST 12H CFST:MCNC:PT:SER/PLAS:QN||^182|mg/dl|70_105
OBX|2|SN|1554-5^GLUCOSE^POST 12H CFST:MCNC:PT:SER/PLAS:QN||^172|mg/dl|70_105
2 MSH|^~\&|GHH LAB|ELAB-3|GHH OE|BLDG4|200202150930||ORU^R01
PID|||555-44-4444||EVERYWOMAN^EVE^E^^^^L|JONES|19620320|F|||153 FERNWOOD DR.^^STATESVILLE^OH^35292|
OBR|1|845439^GHH OE|1045813^GHH LAB|15545^GLUCOSE|||200202150730
OBX|1|SN|1554-5^GLUCOSE^POST 12H CFST:MCNC:PT:SER/PLAS:QN||^182|mg/dl|70_105
OBX|2|SN|1554-5^GLUCOSE^POST 12H CFST:MCNC:PT:SER/PLAS:QN||^172|mg/dl|70_105
请注意 - MSH、OBR、OBX、LX 等可能的段可以是 3 个字符或 2 个字符。因此,最好的方法是在第一个管道之前获取段名称。
我希望在以下条件下将 split_value 中的字符串拆分为多行:
- SEQ——它将从第一列中选择
- SPLIT_SEQ - 它将根据 | 之前的第一个单词进行拆分,例如。MSH, OBR, OBX, LX 后跟从 00 开始的序列。如果有一个 cap
^
,那么它会进一步分解,例如。MSH08-01、MSH08-02
请注意 - MSH 段有一个例外。对于 MSH - 第一个元素是
|
,第二个元素是^~\&
SEQ SPLIT_SEQ SEG_SEQ SPLIT_SEQ_VALUE
1 MSH00 1 MSH
1 MSH01 1 |
1 MSH02 1 ^~\&
1 MSH03 1 GHH LAB
1 MSH04 1 ELAB-3
- SEG_SEQ -- 如果是segment,前面的第一个词| 在同一个 SEQ 中重复,然后增加它。因此,如果 OBX 是两次,那么第一个 OBX 值将是 1,而对于第二个 OBX,它将是 2,依此类推
- SPLIT_SEQ_VALUE -- 上述消息中的值将在此处指定。
请注意 - 我在 text_file 表中有大约 90,000 行。所以该解决方案应该能够有效地处理 90,000 个。
完整的输出是:
SEQ SPLIT_SEQ SEG_SEQ SPLIT_SEQ_VALUE
1 MSH00 1 MSH
1 MSH01 1 |
1 MSH02 1 ^~\&
1 MSH03 1 GHH LAB
1 MSH04 1 ELAB-3
1 MSH05 1 GHH OE
1 MSH06 1 BLDG4
1 MSH07 1 200202150930
1 MSH08 1
1 MSH09-01 1 ORU
1 MSH09-02 1 R01
1 PID00 1 PID
1 PID01 1
1 PID02 1
1 PID03 1 555-44-4444
1 PID04 1
1 PID05-01 1 EVERYWOMAN
1 PID05-02 1 EVE
1 PID05-03 1 E
1 PID05-04 1
1 PID05-05 1
1 PID05-06 1
1 PID05-07 1 L
1 PID06 1 JONES
1 PID07 1 19620320
1 PID08 1 F
1 PID09 1
1 PID10 1
1 PID11-01 1 153 FERNWOOD DR.
1 PID11-02 1
1 PID11-03 1 STATESVILLE
1 PID11-04 1 OH
1 PID11-05 1 35292
1 PID12 1
1 OBR00 1 OBR
1 OBR01 1 1
1 OBR02-01 1 845439
1 OBR02-02 1 GHH OE
1 OBR03-01 1 1045813
1 OBR03-02 1 GHH LAB
1 OBR04-01 1 15545
1 OBR04-02 1 GLUCOSE
1 OBR05 1
1 OBR06 1
1 OBR07 1 200202150730
1 OBX00 1 OBX
1 OBX01 1 1
1 OBX02 1 SN
1 OBX03-01 1 1554-5
1 OBX03-02 1 GLUCOSE
1 OBX03-03 1 POST 12H CFST:MCNC:PT:SER/PLAS:QN
1 OBX04 1
1 OBX05-01 1
1 OBX05-02 1 182
1 OBX06 1 mg/dl
1 OBX07 1 70_105
1 OBX00 2 OBX
1 OBX01 2 1
1 OBX02 2 SN
1 OBX03-01 2 1554-5
1 OBX03-02 2 GLUCOSE
1 OBX03-03 2 POST 12H CFST:MCNC:PT:SER/PLAS:QN
1 OBX04 2
1 OBX05-01 2
1 OBX05-02 2 182
1 OBX06 2 mg/dl
1 OBX07 2 70_105
2 MSH00 1 MSH
2 MSH01 1 |
2 MSH02 1 ^~\&
2 MSH03 1 GHH LAB
2 MSH04 1 ELAB-3
2 MSH05 1 GHH OE
2 MSH06 1 BLDG4
2 MSH07 1 200202150930
2 MSH08 1
2 MSH09-01 1 ORU
2 MSH09-02 1 R01
2 PID00 1 PID
2 PID01 1
2 PID02 1
2 PID03 1 555-44-4444
2 PID04 1
2 PID05-01 1 EVERYWOMAN
2 PID05-02 1 EVE
2 PID05-03 1 E
2 PID05-04 1
2 PID05-05 1
2 PID05-06 1
2 PID05-07 1 L
2 PID06 1 JONES
2 PID07 1 19620320
2 PID08 1 F
2 PID09 1
2 PID10 1
2 PID11-01 1 153 FERNWOOD DR.
2 PID11-02 1
2 PID11-03 1 STATESVILLE
2 PID11-04 1 OH
2 PID11-05 1 35292
2 PID12 1
2 OBR00 1 OBR
2 OBR01 1 1
2 OBR02-01 1 845439
2 OBR02-02 1 GHH OE
2 OBR03-01 1 1045813
2 OBR03-02 1 GHH LAB
2 OBR04-01 1 15545
2 OBR04-02 1 GLUCOSE
2 OBR05 1
2 OBR06 1
2 OBR07 1 200202150730
2 OBX00 1 OBX
2 OBX01 1 1
2 OBX02 1 SN
2 OBX03-01 1 1554-5
2 OBX03-02 1 GLUCOSE
2 OBX03-03 1 POST 12H CFST:MCNC:PT:SER/PLAS:QN
2 OBX04 1
2 OBX05-01 1
2 OBX05-02 1 182
2 OBX06 1 mg/dl
2 OBX07 1 70_105
2 OBX00 2 OBX
2 OBX01 2 1
2 OBX02 2 SN
2 OBX03-01 2 1554-5
2 OBX03-02 2 GLUCOSE
2 OBX03-03 2 POST 12H CFST:MCNC:PT:SER/PLAS:QN
2 OBX04 2
2 OBX05-01 2
2 OBX05-02 2 182
2 OBX06 2 mg/dl
2 OBX07 2 70_105
我相信作为 plsql 流水线函数将是最好的方法。
任何帮助,将不胜感激。