2012-06-07 6 views
0
mysql> select description from devices where id=172; 
+--------------------------------------------------------------------------------+ 
| description                 | 
+--------------------------------------------------------------------------------+ 
| Fault: 'HYD OIL TEMP HIGH' from 'Controller' of type 'SYSTEM' with code '1003' | 
+--------------------------------------------------------------------------------+ 
1 row in set (0.01 sec) 

Вышеупомянутый шаблон, в котором у меня есть записи в моей базе данных. Я пытаюсь разбить их на несколько столбцов, как это только для запуска отчета.mysql столбец в несколько столбцов на основе значения

+---------+------------------------+--------------+---------+---------+ 
| status | description   | device  | system | code | 
+---------+------------------------+--------------+---------+---------+ 
| Fault | HYD HYD OIL TEMP HIGH | controller | SYSTEM | 1003 | 
+---------+------------------------+--------------+---------+---------+ 

Я знаю, что вышеупомянутый материал, который я делаю, хуже. Я не хочу менять ETL для запуска одноразового отчета. Это то, что я пробовал.

mysql> select substr(description, 1, locate(":", description)-1) as status from devices where id=172; 
+--------+ 
| status | 
+--------+ 
| Fault | 
+--------+ 
1 row in set (0.00 sec) 

База данных по амазонке RDS. Поэтому я не могу использовать lib_mysqludf_preg. Я могу сделать простой SQL. Помощь приветствуется. Благодарю.

+0

Зачем вам нужно выполнять эти манипуляции? Будете ли вы использовать результирующие столбцы в SQL или это просто для презентации? Если последнее, вы можете (и, вероятно, должны) предпринять такие действия в своей заявке. – eggyal

+0

Я просто пытаюсь проанализировать отчет о сбоях, его трудно поймать с существующим форматом. Но да, если бы у меня было приложение, я бы делал это там, а не в слое sql. – Deepak

ответ

1

Попробуйте один -

SELECT 
    SUBSTRING_INDEX(description, ':', 1) status, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(description, '''', 2), '''', -1) description, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(description, '''', 4), '''', -1) device, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(description, '''', 6), '''', -1) system, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(description, '''', 8), '''', -1) code 
FROM 
    devices 
WHERE 
    id = 172; 
+0

Вау, именно то, что мне нужно. Благодаря тонну. – Deepak

0

Это не будет легко, скорее всего, сделать это на стороне приложения было бы лучше. Но если вам нужно сделать это с помощью собственного SQL, вы должны, вероятно, попробовать использовать комбинацию MID и LOCATE. Это даст вам подстроки и местоположения строк, чтобы предположить, что формат строки будет согласован.

У вас есть status поле сделано, здесь я дам вам description и device, вы должны получить представление о том, как закончить его (st является строка описания)

SELECT 
    MID(st, LOCATE(': ',st) + 3, LOCATE(' from ',st) - LOCATE(': ',st) - 4) AS description, 
    MID(st, LOCATE(' from ',st) + 7, LOCATE(' of type ',st) - LOCATE(' from ',st) - 8) AS device 
FROM yourtable 
Смежные вопросы