2012-05-01 102 views
2

我想在這樣的低於表中提取一個字符串值,從表中的字符串提取值?

查詢表,

query_id value 
1   type={"page":"page"}&parent_id=10&image=on&content=on 
2   type={"page":"page"}&parent_id=self 
3   type={"category":"contact"} 

正如你所看到的PARENT_ID是查詢,有時則不然。

我想提取PARENT_ID所以我得到這樣的結果,

query_id page_id  value 
1   10   type={"page":"page"}&parent_id=10&image=on&content=on 
2   self  type={"page":"page"}&parent_id=self 
3   null  type={"category":"contact"} 

我嘗試此查詢,

SELECT 
    *, 
    CAST(
     SUBSTRING(
      value,PATINDEX('%parent_id=%', value) + 8,(PATINDEX('%&%', substring(value,PATINDEX('%parent_id=%', value),50)) - 9) 
      ) AS INT 
     ) AS page_id 
FROM query 

但是我得到這個錯誤,

1064 - You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use 
near 'INT) AS page_id FROM query LIMIT 0, 30' at line 6 

編輯:

也許我應該使用PATINDEX爲我下面的查詢進行了測試,

SELECT 
    *, 
    SUBSTRING(
      value,PATINDEX('%parent_id=%', value) + 8,(PATINDEX('%&%', substring(value,PATINDEX('%parent_id=%', value),50)) - 9) 
      ) AS test 
FROM query 

我得到這個錯誤,

#1305 - FUNCTION mydb.PATINDEX does not exist 

編輯:

得到了我的答案,

SELECT 
    *, 
    IF(LOCATE('parent_id=', value)>0,SUBSTRING_INDEX(SUBSTRING(value,LOCATE('parent_id=', value) + 10),'&',1),null)AS page_id 
FROM query 
+1

這就是爲什麼人們發明了關係數據庫和標準化。規範你的數據庫,答案應該是'SELECT page_id'。 –

回答

3

INT已在MYSQL中使用。使用正確的語法

SELECT 
    *, 
    CAST(
     SUBSTRING(
      `value`,PATINDEX('%parent_id=%', `value`) + 8,(PATINDEX('%&%', substring(`value`,PATINDEX('%parent_id=%', `value`),50)) - 9) 
      ) AS `INT` 
     ) AS `page_id` 
FROM `query` 
+1

是的,總是逃避你的域名**和別名**,以避免MySQL與保留名稱(如INT)混淆。 +1 – Oldskool

+0

對不起,我仍然得到相同的錯誤... – laukok

+0

你的代碼現在看起來如何? –