0

嗨,我有一个 mysql 表,其中包含如下数据

mysql> select * from query limit 5\G
*************************** 1. row ***************************
text:   <AUDIT_RECORD TIMESTAMP="2013-08-20T14:07:41" NAME="Query" CONNECTION_ID="12427041" STATUS="0" SQLTEXT="/* mysql-connector-java-5.1.18 ( Revision: tonci.grgin@oracle.com-20110930151701-jfj14ddfq48ifkfq ) */SELECT @@session.auto_increment_increment"/> 
*************************** 2. row ***************************
text:   <AUDIT_RECORD TIMESTAMP="2013-08-20T14:07:41" NAME="Query" CONNECTION_ID="12427032" STATUS="0" SQLTEXT="/* mysql-connector-java-5.1.18 ( Revision: tonci.grgin@oracle.com-20110930151701-jfj14ddfq48ifkfq ) */SELECT @@session.auto_increment_increment"/> 
*************************** 3. row ***************************
text:   <AUDIT_RECORD TIMESTAMP="2013-08-20T14:07:41" NAME="Query" CONNECTION_ID="12427046" STATUS="0" SQLTEXT="select * from MM_CUSTOMER where upper(custcode) ='DECT'"/> 
*************************** 4. row ***************************
text:   <AUDIT_RECORD TIMESTAMP="2013-08-20T14:07:41" NAME="Query" CONNECTION_ID="12427042" STATUS="0" SQLTEXT="select * from MM_CUSTOMER where upper(custcode) ='MKTF'"/> 
*************************** 5. row ***************************
text:   <AUDIT_RECORD TIMESTAMP="2013-08-20T14:07:41" NAME="Query" CONNECTION_ID="12427040" STATUS="0" SQLTEXT="select * from MM_CUSTOMER where upper(custcode) ='FLYC'"/> 
5 rows in set (0.00 sec)

现在我想以以下格式提取结果

+--------------------------+----------------------------------+--------------------------------------+
| ID                       | timestamp                        | text                                 |
+--------------------------+----------------------------------+--------------------------------------+
| CONNECTION_ID="12427042" | TIMESTAMP="2013-08-20T14:07:41"  | "SET sql_mode='STRICT_TRANS_TABLES'" |
+--------------------------+----------------------------------+--------------------------------------+

最终结果是根据ID排序,根据文本分组,比如all set,然后全部选择,然后更新......

选择:

如果可能,请告诉我如何加载如下文件

<AUDIT>
      <AUDIT_RECORD TIMESTAMP="2013-08-20T14:07:41" NAME="Query" CONNECTION_ID="12427046" STATUS="0" SQLTEXT="select * from MM_CUSTOMER where upper(custcode) ='DECT'"/>
      <AUDIT_RECORD TIMESTAMP="2013-08-20T14:07:41" NAME="Query" CONNECTION_ID="12427042" STATUS="0" SQLTEXT="select * from MM_CUSTOMER where upper(custcode) ='MKTF'"/>
      <AUDIT_RECORD TIMESTAMP="2013-08-20T14:07:41" NAME="Query" CONNECTION_ID="12427040" STATUS="0" SQLTEXT="select * from MM_CUSTOMER where upper(custcode) ='FLYC'"/>
</AUDIT>

进入表格,如......具有上述标准。

mysql> desc query;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| ID        | varchar(50) | YES  |     | NULL    |       |
| timestamp | varchar(50) | YES  |     | NULL    |       |
| text      | text        | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

任何人都可以帮助我如何实现这一目标?

4

1 回答 1

3

理想情况下,您应该已经解析了这些记录,并且您将插入每个属性的值,而不必事后解析它们。

但是,如果您被 XML 卡住了,并且需要用它创建一个真实的表格,您可以尝试使用它ExtractValue()来获取您想要的部分。

SELECT
    ExtractValue(`text`, '//@TIMESTAMP')     audit_time,
    ExtractValue(`text`, '//@CONNECTION_ID') connection_id,
    ExtractValue(`text`, '//@SQLTEXT')       sql
FROM query;

注意: 不要定期这样做。 理想情况下,您会做一次,将这些值放入适当的表中。每次都从 XML 中提取会破坏 MySQL 服务器的性能;您最终不仅要为每一行解析 XML,而且在 XML 之外没有要过滤或排序的东西,基本上每个操作都会强制进行全表扫描。

(哦,说真的。你如何选择一半的列名作为关键字? TIMESTAMP并且TEXT是 SQL 值类型的名称。)

于 2013-08-22T21:35:19.570 回答