2013-04-03 46 views
1

我有PostgreSQL中這個數據在一列如何逃避一些字符在PostgreSQL的

{ 
    "geometry":{ 
     "status":"Point", 
     "coordinates":[ 
      -122.421583, 
      37.795027  
     ]   
    }, 

,並使用我自己的查詢

select * from students where data_json LIKE '%status%' ;

上面的查詢返回的結果,但是這一次不

select * from students where data_json LIKE '%status:%' ;

如何修復該問題

回答

3

當然,第二個找不到匹配項,該值中沒有status:文本。我想你想:

select * from students where data_json LIKE '%"status":%' 

...然而,等,其中您嘗試文本模式的結構化數據,這是在一般可怕想法,會咬你匹配上大多數情況下。只是一對夫婦的問題的例子:

{ 
    "somekey": "the value is \"status\": true" 
} 

...其中"status":顯示爲文本值的組成部分,將匹配即使它不應該,並且:

{ 
    status : "blah" 
} 

其中status有引號和冒號之間沒有引號和空格。就JavaScript而言,這與"status":相同,但不匹配。

如果您正在嘗試在json中查找字段或從json中提取字段,請使用json解析器執行此操作。 PL/V8 may be of interest,或者可用於pl/perl,pl/pythonu等工具的json庫。未來的Pos​​tgreSQL版本將具有通過路徑獲取json關鍵字的功能,測試json值是否存在等,但9.2不支持。

在這一點上你可能會想「爲什麼我不使用正則表達式」。不要去那裏,你不要想嘗試在正則表達式中寫一個完整的JSON解析器。 this blog entry is somewhat relevant

+0

我可以使用hstore進行該類型的搜索嗎 – user194932147

+0

@ user194932147'hstore'是平的,它沒有嵌套鍵。你可能會編寫代碼來將'json'變成'hstore'並忽略/覆蓋重複鍵,但它會(a)有點不安全,並且(b)需要你做大部分你必須做的工作無論如何,一個適當的JSON密鑰搜索。正如我所說的,使用PL/V8,PL/Perl或類似的方法來編寫密鑰查找函數或找到其他人已經編寫的函數。您可以在密鑰查找功能上創建功能索引。 –

+0

感謝哥們,我現在明白了 – user194932147