2014-08-27 95 views
2

假設你有一個表「城市」如下:MySQL的XML與列數據比較

Id | CodeNumber | CityXml 

而且你已存儲在您CityXml列下面的XML

<record> 
    <data code="10">istanbul</data> 
    <data code="20">madrid</data> 
</record> 

而你要獲取代碼= 10的城市名稱。爲了做到這一點,你可以寫:

SELECT 
ExtractValue(Cities.CityXml, '/record/data[code="10"][1]') AS CityName 
FROM Cities 

這工作正常。

/* this does not work */ 
SELECT 
CodeNumber, 
ExtractValue(Cities.CityXml, '/record/data[code="CodeNumber"][1]') AS CityName 
FROM Cities 

在SQL Server中,你可以寫如下語句:

SELECT 
CodeNumber, 
ExtractValue(Cities.CityXml, '/record/data[code=sql:column("CodeNumber")][1]') AS CityName 
FROM Cities 

但你怎麼能寫在MySQL當代碼號從表的另一列給我的問題開始?

回答

2

構建使用CONCAT

SELECT CodeNumber, 
     EXTRACTVALUE(Cities.City, CONCAT('/record/data/[code="', CodeNumber, '"][1]') AS CityName 
FROM Cities 
+0

非常感謝您對這個快速反應的XPath字符串。我現在試過了,它返回:「只支持常量xpath查詢」。 – isa 2014-08-27 17:48:36

+0

由此,我們會推斷這種類型的設計不會在mysql中嗎? – isa 2014-08-27 17:49:22

+0

我想你可能需要編寫一個存儲過程來獲取所有的'CodeNumber',然後執行一個使用'PREPARE'爲每個代碼編號創建動態SQL的循環。 – Barmar 2014-08-27 17:54:45