2016-12-20 4 views
0

ストーリーショート:私はMySQL 5.6を使用しています(現時点では、新しいバージョンに更新することはできません)保存されています。データベースに保存されているMySQL 5.6を使用してJSONオブジェクトのプロパティを検索します。

サンプルJSONオブジェクト:

-- Row #1 (`options` column) 
{"name": "Test", "description": "Some description", "type": "post", "scheduled": true, "deleted": false, "timestamp": "1482263883"} 

-- Row #2 (`options` column) 
{"name": "", "description": "Some description test", "type": "post", "scheduled": true, "deleted": false, "timestamp": "1482263883"} 

問題:私は私のJSONオブジェクトに格納されているname財産に対する記録を検索することができるようにしたい

SELECT * FROM `my_table` WHERE ((`options` LIKE '%"name":"%Test%"%')) 

上記のクエリは正常に動作し、時にはそれは、偽陽性を返すことができる(それはdescriptionプロパティの「テスト」の文字列が含まれているように、例えば2行目も同様に返されます)。

いくつかの注意事項:

  1. options列に格納されたオブジェクトが正確に行ごとに同じであり、例えばnameプロパティは各レコードの最初の位置にあります。
+2

さて、現在の実装で、それは不可能です。あなたは名前の中でのみ検索するために最新のものを持っている必要があります。 –

+0

第二行は、説明フィールドで 'test'を持っているので、それはまたtest''の 'NAME'を有するので、それは戻り戻りません。もちろん、両方の行に同じ値が返されます。 –

+0

あなたは何を検索したいのですか?最初の行と2番目の行は '' name ":" Test "'を持つように、例のように一致する必要があります。 –

答えて

3

LIKEの代わりに正規表現を使用できます。これは、行が含まれている場合は、代わりにあなたが得た偽陽性の、これは偽陰性を作り出すことができるLIKE

SELECT * FROM my_table 
WHERE options REGEXP '"name": *"[^"]*Test' 

%ワイルドカードとは異なり、文字列の境界を越えて行くことはありませんパターンを使用することができます:

"name": "This is a \"quoted\" Test" 

[^"]*はエスケープされた引用符を渡さないためです。

は、このためにできるようにする正規表現を洗練するいくつかの方法があるかもしれませんが、それは簡単ではありません。

+0

私が思う 'オプション正規表現バイナリー「『名前』:[[:スペース:]]『テスト』」'十分だろうし、それは同様に大文字と小文字の区別を処理します。 –

+0

彼の元のクエリは、 ''「%テスト%」を持っているので、私は彼がどこにでもそれで 'Test'が含まれている名前を見つけたいと思った、ではないそれは完全一致のWHERE。もしそれが彼が望むものなら、彼は単に 'LIKE '%" name ":" Test "%''を使うことができ、彼は偽陽性を得ないでしょう。 – Barmar

関連する問題