Преобразовать некоторые подстроки из множества строк в новую таблицу - PullRequest
0 голосов
/ 22 января 2019

Я хочу преобразовать этот вывод из строки "topic" ...

SMARTBASE/N0184/1/MOISTURE/value
SMARTBASE/N0184/1/MOISTURE/unit
SMARTBASE/N0184/1/MOISTURE/timestamp
SMARTBASE/N0184/1/CONDUCTIVITY/value
SMARTBASE/N0184/1/CONDUCTIVITY/unit
SMARTBASE/N0184/1/CONDUCTIVITY/timestamp

в новую таблицу, такую ​​как:

SENSORS|MOISTURE(value)|MOISTURE(unit)|CONDUCTIVITY(value)|CONDUCTIVITY(unit) N0184|0.41437244624|Raw VWC|0.5297062938712509|mS/cm

первая строка: значения темы (строки), вторая строка: значения значения (строки) (значения mqtt-themes)

, но это датчик 500 ++ ... SMARTBASE не всегда является SMARTBASE, поэтому regexp _... не очень хорошая идея ... В конце концов, это должно быть сохранено как представление.

Возможно ли это?Я не знаю, как это реализовать ... или как начать с этого.чтобы преобразовать строку в таблицу, я могу использовать функцию pivot, но остальное я не знаю.

моя основная проблема: как я могу получить доступ к отдельным значениям темы?

1 Ответ

0 голосов
/ 22 января 2019

Используйте REGEXP_SUBSTR, чтобы получить компоненты подстроки вашего столбца topic, а затем используйте PIVOT:

Установка Oracle :

CREATE TABLE table_name ( topic, value ) AS 
SELECT 'SMARTBASE/N0184/1/MOISTURE/value',         '0.414' FROM DUAL UNION ALL
SELECT 'SMARTBASE/N0184/1/MOISTURE/unit',          'Raw VWC' FROM DUAL UNION ALL
SELECT 'SMARTBASE/N0184/1/MOISTURE/timestamp',     '2019-01-01T00:00:00.000' FROM DUAL UNION ALL
SELECT 'SMARTBASE/N0184/1/CONDUCTIVITY/value',     '0.529' FROM DUAL UNION ALL
SELECT 'SMARTBASE/N0184/1/CONDUCTIVITY/unit',      'mS/cm' FROM DUAL UNION ALL
SELECT 'SMARTBASE/N0184/1/CONDUCTIVITY/timestamp', '2019-01-01T00:00:00.000' FROM DUAL;

Запрос

SELECT SENSOR_TYPE,
       SENSOR,
       TO_NUMBER( moisture_value ) AS moisture_value,
       moisture_unit,
       TO_TIMESTAMP( moisture_timestamp, 'YYYY-MM-DD"T"HH24:MI:SS.FF3' ) AS moisture_timestamp,
       TO_NUMBER( conductivity_value ) AS conductivity_value,
       conductivity_unit,
       TO_TIMESTAMP( conductivity_timestamp, 'YYYY-MM-DD"T"HH24:MI:SS.FF3' ) AS conductivity_timestamp
FROM   (
  SELECT REGEXP_SUBSTR( topic, '[^/]+', 1, 1 ) AS sensor_type,
         REGEXP_SUBSTR( topic, '[^/]+', 1, 2 ) AS sensor,
         REGEXP_SUBSTR( topic, '[^/]+', 1, 4 ) AS measurement_name,
         REGEXP_SUBSTR( topic, '[^/]+', 1, 5 ) AS measurement_metadata_type,
         value
  FROM   table_name
)
PIVOT(
  MAX( value )
  FOR ( measurement_name, measurement_metadata_type )
  IN  (
    ( 'MOISTURE', 'value'     ) AS MOISTURE_value,
    ( 'MOISTURE', 'unit'      ) AS MOISTURE_unit,
    ( 'MOISTURE', 'timestamp' ) AS MOISTURE_timestamp,
    ( 'CONDUCTIVITY', 'value'     ) AS CONDUCTIVITY_value,
    ( 'CONDUCTIVITY', 'unit'      ) AS CONDUCTIVITY_unit,
    ( 'CONDUCTIVITY', 'timestamp' ) AS CONDUCTIVITY_timestamp
  )
)

выход

SENSOR_TYPE | SENSOR | MOISTURE_VALUE | MOISTURE_UNIT | MOISTURE_TIMESTAMP              | CONDUCTIVITY_VALUE | CONDUCTIVITY_UNIT | CONDUCTIVITY_TIMESTAMP         
:---------- | :----- | -------------: | :------------ | :------------------------------ | -----------------: | :---------------- | :------------------------------
SMARTBASE   | N0184  |           .414 | Raw VWC       | 01-JAN-19 12.00.00.000000000 AM |               .529 | mS/cm             | 01-JAN-19 12.00.00.000000000 AM

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...