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)

以上是我在数据库中有记录的模式。我试图将它们分成多个列,就像这样只是为了运行报告。

+---------+------------------------+--------------+---------+---------+
| 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。帮助表示赞赏。谢谢。

4

2 回答 2

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;
于 2012-06-07T06:23:59.757 回答
0

这并不容易,很可能在应用程序端做这件事是最好的。但是,如果您需要使用原生 SQL 来执行此操作,您可能应该尝试使用 和 的MID组合LOCATE。这些将为您提供字符串的子字符串和位置,因此它会假设字符串的格式将是一致的。

你已经status完成了这个领域,在这里我会给你descriptiondevice你应该知道如何完成它(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
于 2012-06-07T05:36:30.773 回答