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)
以上是我在数据库中记录的模式。我试图将它们分成多个列,就像运行报告一样。
+---------+------------------------+--------------+---------+---------+
| 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 :(得分: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;
答案 1 :(得分: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