Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Поиск в JSON как в строке  [new]
Santa89
Member

Откуда:
Сообщений: 1476
Всем привет! Есть очень сильно изменяющаяся структура JSON (разные уровни вложенности, названия, итд).
JSON такого вида:

[{
              "-join": "left",
              "-type": "join",
              "clause": {
                "-type": "join",
                "expression": {
                  "-op": "AND",
                  "expression": [
                    {
                      "-op": "=",
                      "expression": [
                        {
                          "-op": "[tbl_2_3_EN].[Version_ID]"
                        },
                        {
                          "-op": "[tbl_2_2_EN].[Version_ID]"
                        }
                      ]
                    },
                    {
                      "-op": "=",
                      "expression": [
                        {
                          "-op": "[tbl_2_3_EN].[uda_3_54]"
                        },
                        {
                          "-op": "[tbl_2_2_EN].[ID]"
                        }
                      ]
                    }
                  ]
                }
              },
              "relation": [
                {
                  "-connection": "sqlserver.19z8ndd0q9wa081bnydlk0flgbi3",
                  "-name": "tbl_2_3_EN",
                  "-table": "[mdm].[tbl_2_3_EN]",
                  "-type": "table"
                },
                {
                  "-connection": "sqlserver.19z8ndd0q9wa081bnydlk0flgbi3",
                  "-name": "tbl_2_2_EN",
                  "-table": "[mdm].[tbl_2_2_EN]",
                  "-type": "table"
                }
              ]}]


Вопрос:
мне нужно найти все сочетания атрибутов "-connection","-name","-table","-type".
средствами парсинга JSON на SQL Server 2016 такого сделать вряд-ли получится, т.к. повторюсь - очень сильно изменяющаяся структура. Планирую делать через поиск в строке.

Т.е. на выходе должна получится табличка типа:

|-connection||-name||-table||-type|
|sqlserver.19z8ndd0q9wa081bnydlk0flgbi3||tbl_2_3_EN||[mdm].[tbl_2_2_EN]||table|
|sqlserver.19z8ndd0q9wa081bnydlk0flgbi3||tbl_2_2_EN||[mdm].[tbl_2_2_EN]||table|

Как это можно было бы сделать?
29 мар 19, 15:37    [21847243]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в JSON как в строке  [new]
Santa89
Member

Откуда:
Сообщений: 1476
Для лучшего понимания, каким разнообразным может быть уровень вложенности элемента "relation" привожу пример JSON сгенерённого для другого элемента данных:


DECLARE @JSON VARCHAR(MAX) = 
'{
              "-join": "inner",
              "-type": "join",
              "clause": {
                "-type": "join",
                "expression": {
                  "-op": "AND",
                  "expression": [
                    {
                      "-op": "=",
                      "expression": [
                        {
                          "-op": "[region].[Version_ID]"
                        },
                        {
                          "-op": "[country].[Version_ID]"
                        }
                      ]
                    },
                    {
                      "-op": "=",
                      "expression": [
                        {
                          "-op": "[region].[uda_5_257]"
                        },
                        {
                          "-op": "[country].[ID]"
                        }
                      ]
                    }
                  ]
                }
              },
              "relation": [
                {
                  "-join": "inner",
                  "-type": "join",
                  "clause": {
                    "-type": "join",
                    "expression": {
                      "-op": "AND",
                      "expression": [
                        {
                          "-op": "=",
                          "expression": [
                            {
                              "-op": "[city].[Version_ID]"
                            },
                            {
                              "-op": "[region].[Version_ID]"
                            }
                          ]
                        },
                        {
                          "-op": "=",
                          "expression": [
                            {
                              "-op": "[city].[uda_6_258]"
                            },
                            {
                              "-op": "[region].[ID]"
                            }
                          ]
                        }
                      ]
                    }
                  },
                  "relation": [
                    {
                      "-join": "inner",
                      "-type": "join",
                      "clause": {
                        "-type": "join",
                        "expression": {
                          "-op": "=",
                          "expression": [
                            {
                              "-op": "[MDS_Fact_Table_For_Hierarchies].[location_id]"
                            },
                            {
                              "-op": "[city].[ID]"
                            }
                          ]
                        }
                      },
                      "relation": [
                        {
                          "-connection": "sqlserver.0d73hc20uzjr801ezwenn1dpyfz1",
                          "-name": "MDS_Fact_Table_For_Hierarchies",
                          "-table": "[_del].[MDS_Fact_Table_For_Hierarchies]",
                          "-type": "table"
                        },
                        {
                          "-connection": "sqlserver.0d73hc20uzjr801ezwenn1dpyfz1",
                          "-name": "city",
                          "-table": "[mdm].[tbl_3_6_EN]",
                          "-type": "table"
                        }
                      ]
                    },
                    {
                      "-connection": "sqlserver.0d73hc20uzjr801ezwenn1dpyfz1",
                      "-name": "region",
                      "-table": "[mdm].[tbl_3_5_EN]",
                      "-type": "table"
                    }
                  ]
                },
                {
                  "-connection": "sqlserver.0d73hc20uzjr801ezwenn1dpyfz1",
                  "-name": "country",
                  "-table": "[mdm].[tbl_3_4_EN]",
                  "-type": "table"
                }
              ]
            }'

SELECT @JSON
29 мар 19, 15:44    [21847255]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в JSON как в строке  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
https://docs.microsoft.com/en-us/sql/relational-databases/json/json-path-expressions-sql-server?view=sql-server-2017
29 мар 19, 17:21    [21847400]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в JSON как в строке  [new]
Santa89
Member

Откуда:
Сообщений: 1476
Вроде бы вопрос упростился. Теперь есть такая XML:

<relation join="inner" type="join">
  <clause type="join">
    <expression op="AND">
      <expression op="=">
        <expression op="[region].[Version_ID]" />
        <expression op="[country].[Version_ID]" />
      </expression>
      <expression op="=">
        <expression op="[region].[uda_5_257]" />
        <expression op="[country].[ID]" />
      </expression>
    </expression>
  </clause>
  <relation join="inner" type="join">
    <clause type="join">
      <expression op="AND">
        <expression op="=">
          <expression op="[city].[Version_ID]" />
          <expression op="[region].[Version_ID]" />
        </expression>
        <expression op="=">
          <expression op="[city].[uda_6_258]" />
          <expression op="[region].[ID]" />
        </expression>
      </expression>
    </clause>
    <relation join="inner" type="join">
      <clause type="join">
        <expression op="=">
          <expression op="[MDS_Fact_Table_For_Hierarchies].[location_id]" />
          <expression op="[city].[ID]" />
        </expression>
      </clause>
      <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="MDS_Fact_Table_For_Hierarchies" table="[_del].[MDS_Fact_Table_For_Hierarchies]" type="table" />
      <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="city" table="[mdm].[tbl_3_6_EN]" type="table" />
    </relation>
    <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="region" table="[mdm].[tbl_3_5_EN]" type="table" />
  </relation>
  <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="country" table="[mdm].[tbl_3_4_EN]" type="table" />
</relation>
<relation join="inner" type="join">
  <clause type="join">
    <expression op="AND">
      <expression op="=">
        <expression op="[city].[Version_ID]" />
        <expression op="[region].[Version_ID]" />
      </expression>
      <expression op="=">
        <expression op="[city].[uda_6_258]" />
        <expression op="[region].[ID]" />
      </expression>
    </expression>
  </clause>
  <relation join="inner" type="join">
    <clause type="join">
      <expression op="=">
        <expression op="[MDS_Fact_Table_For_Hierarchies].[location_id]" />
        <expression op="[city].[ID]" />
      </expression>
    </clause>
    <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="MDS_Fact_Table_For_Hierarchies" table="[_del].[MDS_Fact_Table_For_Hierarchies]" type="table" />
    <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="city" table="[mdm].[tbl_3_6_EN]" type="table" />
  </relation>
  <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="region" table="[mdm].[tbl_3_5_EN]" type="table" />
</relation>
<relation join="inner" type="join">
  <clause type="join">
    <expression op="=">
      <expression op="[MDS_Fact_Table_For_Hierarchies].[location_id]" />
      <expression op="[city].[ID]" />
    </expression>
  </clause>
  <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="MDS_Fact_Table_For_Hierarchies" table="[_del].[MDS_Fact_Table_For_Hierarchies]" type="table" />
  <relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="city" table="[mdm].[tbl_3_6_EN]" type="table" />
</relation>
<relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="MDS_Fact_Table_For_Hierarchies" table="[_del].[MDS_Fact_Table_For_Hierarchies]" type="table" />
<relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="city" table="[mdm].[tbl_3_6_EN]" type="table" />
<relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="region" table="[mdm].[tbl_3_5_EN]" type="table" />
<relation connection="sqlserver.0d73hc20uzjr801ezwenn1dpyfz1" name="country" table="[mdm].[tbl_3_4_EN]" type="table" />
<relation join="left" type="join">
  <clause type="join">
    <expression op="AND">
      <expression op="=">
        <expression op="[tbl_2_3_EN].[Version_ID]" />
        <expression op="[tbl_2_2_EN].[Version_ID]" />
      </expression>
      <expression op="=">
        <expression op="[tbl_2_3_EN].[uda_3_54]" />
        <expression op="[tbl_2_2_EN].[ID]" />
      </expression>
    </expression>
  </clause>
  <relation connection="sqlserver.19z8ndd0q9wa081bnydlk0flgbi3" name="tbl_2_3_EN" table="[mdm].[tbl_2_3_EN]" type="table" />
  <relation connection="sqlserver.19z8ndd0q9wa081bnydlk0flgbi3" name="tbl_2_2_EN" table="[mdm].[tbl_2_2_EN]" type="table" />
</relation>
<relation connection="sqlserver.19z8ndd0q9wa081bnydlk0flgbi3" name="tbl_2_3_EN" table="[mdm].[tbl_2_3_EN]" type="table" />
<relation connection="sqlserver.19z8ndd0q9wa081bnydlk0flgbi3" name="tbl_2_2_EN" table="[mdm].[tbl_2_2_EN]" type="table" />


Нужно вытащить из неё все тэги у которых есть атрибут Connection, там дальше уже просто будет.
Но вот вопрос как их вытащить?

Делаю:

SELECT
	XMLData.query('//relation')
	FROM #XMLwithOpenXML
	WHERE XMLData.exist('/connection') <> 0


не получается...
30 мар 19, 13:57    [21847785]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в JSON как в строке  [new]
invm
Member

Откуда: Москва
Сообщений: 9279
select
 b.n.query('.')
from
 #XMLwithOpenXML a cross apply
 a.XMLdata.nodes('//*[@connection]') b(n);
30 мар 19, 14:54    [21847817]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в JSON как в строке  [new]
Santa89
Member

Откуда:
Сообщений: 1476
Да. оно! Спасибо
30 мар 19, 16:51    [21847879]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить