2017-08-31 8 views
1

を使用して:JSONクエリ私は、SQLサーバーに保存されたJSONデータを持っているSQL Serverの

{ 
"group":{ 
    "operator":"AND", 
    "rules":[ 
    { 
     "condition":"=", 
     "field":"F1", 
     "table":"ATT", 
     "data":"TEST", 
     "readOnly":false, 
     "hidden":false, 
     "$$hashKey":"005" 
    }, 
    { 
     "condition":"=", 
     "field":"CLASS", 
     "table":"OBJ", 
     "data":"A1", 
     "readOnly":false, 
     "hidden":false, 
     "$$hashKey":"008" 
    }, 
    { 
     "group":{ 
      "operator":"AND", 
      "rules":[ 
       { 
       "condition":"=", 
       "field":"F1", 
       "table":"ATT", 
       "data":"TEST2", 
       "readOnly":false, 
       "hidden":false, 
       "$$hashKey":"00D" 
       }, 
       { 
       "condition":"=", 
       "field":"F1", 
       "table":"ATT", 
       "data":"TEST3", 
       "readOnly":false, 
       "hidden":false, 
       "$$hashKey":"00G" 
       } 
      ] 
     }, 
     "table":"", 
     "$$hashKey":"009" 
    } 
    ] 
} 
} 

は、どのように私はSQLを使用して値= F1を持つ要素フィールドの数を得ることができますか?

+0

jsonデータはSQLサーバーに保存されていますか? – N1gthm4r3

+0

@ N1gthm4r3:[はい](https://docs.microsoft.com/sql/relational-databases/json/json-data-sql-server)。 –

+0

「カウント」とはどういう意味ですか?あなたは、 'field'プロパティに対して' condition'の値が 'F1'であるか知りたいですか? –

答えて

0
DECLARE @json NVARCHAR(MAX) = '{"group":{ 
    "operator":"AND", 
    "rules": 
     [{"condition":"=", 
     "field":"F1", 
     "table":"ATT", 
     "data":"TEST", 
     "readOnly":false, 
     "hidden":false, 
     "$$hashKey":"005"}, 
     {"condition":"=", 
     "field":"BANKID", 
     "table":"ATT", 
     "data":"A1", 
     "readOnly":false, 
     "hidden":false, 
     "$$hashKey":"008"}]}}'; 

SELECT COUNT(*) 
FROM OPENJSON(@json, '$.group.rules') 
WHERE JSON_VALUE(value, '$.field') = 'F1' 

あなたがテーブルを持って、それを保存しないでください、あなたが言いますか? CROSS APPLYはあなたの友人です:

SELECT T.[data], rules.F1_count 
FROM T CROSS APPLY (
    SELECT COUNT(*) AS F1_count 
    FROM OPENJSON(jsonData, '$.group.rules') 
    WHERE JSON_VALUE(value, '$.field') = 'F1' 
) AS rules 
+0

上記のコードは機能しますが、ここでは変数をjsonにしています。さまざまなjson文字列[同じ形式]を持つN個の行を持つテーブルなので、上記のロジックをすべてのレコード項目に適用してカウントを取得する必要があります。 –

+0

@AbrahamMathewAjoy: 'CROSS APPLY'、更新を参照してください。この場合、サブクエリは1つの値しか得られないので動作しますが、「CROSS APPLY」はより一般的です。 –

+0

はい、私たちは解決策に近づいています。 「テーブル」:「OBJ」、「データ」、「データ」、「データ」、 : "2"、 "readOnly":false、 "hidden":false、 "$$ hashKey": "005"}、 {"グループ":{"演算子": "AND"、 "ルール":[{"条件": "="、 "フィールド": "クラス"、 "テーブル": "OBJ"、 "データ" 「$$ hashKey」:「00C」}}}、「table」:「」、「$$ hashKey」:「008」}]}} –

0

これを試してみてください - アドバイスJSONデータとして>

Select Count(*) 
From mytable 
WHERE JSON_VALUE(Serialized, '$.field')="F1" 
+0

です。有効ではない0として表示されます:( –

0

は、自己保存されるべきではありません。格納するデータに応じてテーブルとカラムを作成する必要があります。多分operatorというテーブルを持つgroupというデータベースを作ってください。これは3つのカラム、演算子、ルール、ルールの値を持ちます。だから、次のようになります。

Operator  Rule RuleValue 
-------- ----------- --------- 
| #1 | condition | =  | 
| #1 | field  | f1  | 
| #1 | table  | ATT | 
| #2 | data  | test | 

あなたは、あなたのニーズにテーブルを変更するが、JSONやXMLを思い出すことができ、ファイル内のデータを格納する方法です。データベースにデータを格納するときに、XMLまたはJSON

関連する問題