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    |
+---------+------------------------+--------------+---------+---------+

私がやっている上記のことはもっと悪いことを知っています。1 回限りのレポートを実行するための 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)

データベースは amazon 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フィールドを完成させました。ここで私はあなたに与えます.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
于 2012-06-07T05:36:30.773 に答える