18

私が使用しているデータベースは、JSONエントリをLONGTEXTデータ型に格納します。JSONデータに応じてエントリを選択できるようにしたい。データの例を次に示します。

 {
    "12f9cb0a-2218-4590-a05d-c1ffab00f693":  {
        "0":  {
            "value": "test"
        }
    },
    "4d1dfd2e-7bc1-4303-9c8c-90856e918bb9":  {
        "item":  {
            "0": "11"
        }
    }
 }

したがって、 "4d1dfd2e-7bc1-4303-9c8c-90856e918bb9":{"item":{"0": "11"}}を含むデータを選択するには、 REGEXP関数、私はこれを無駄に試しました:

SELECT * FROM my_table WHERE (elements REGEXP BINARY '"4d1dfd2e-7bc1-4303-9c8c-90856e918bb9":\s*{\s*"item":\s*{\s*"0":\s*"11"\s*}\s*}');

正規表現テストはRubularとRegexpal.comを使用して機能しますが、MYSQLは\s*式を好まないようです。誰かがこれに対するより良い解決策を持っていますか?

4

3 に答える 3

46

MySQL 8.0より前のMySQL正規表現は、 MySQL 5.7リファレンスマニュアル(または適切なバージョンの対応物)の§12.7.2「正規表現」にリストされている表記法のみをサポートします。これには表記法は含まれますが、[[:space:]]表記法は含まれません\s\sしたがって、出現するたびにをで置き換える必要があります[[:space:]]

MySQL 8.0以降では、MySQLはUnicode[ link ]の国際コンポーネントの正規表現サポートを使用します。これには\s[ link ]が含まれます。ただし、MySQL自体が\文字列内のエスケープ文字として使用するため、バックスラッシュを2倍にして、出現するたびにを置き換える必要があり\sます\\s

于 2013-03-21T21:15:25.110 に答える
0

文字列置換を使用します。

select replace(json, ' ','') from table;

データにスペースが含まれている場合、これは機能しません。

于 2013-03-21T21:16:00.597 に答える
0

jsonタイプを使用することをお勧めします: SELECT CAST(`column` AS JSON) WHERE JSON_EXTRACT(CAST(`column` as JSON),'$."4d1dfd2e-7bc1-4303-9c8c-90856e918bb9".item."0"')="11"

于 2017-03-21T13:52:07.347 に答える