Есть ли только SQL-способ превратить иерархическую таблицу в набор строк JSON? - PullRequest
1 голос
/ 05 января 2011

У меня есть иерархическая таблица, упрощенная версия которой может выглядеть следующим образом:

id parentid text
-- -------- ----
1  null     A
2  1        Ax
3  1        Ay
4  3        Ay2
5  null     B
6  5        Bx

Я хочу перенести все данные из этой таблицы в формате json.Результат таблицы выше должен выглядеть примерно так:

{
  "text":"A",
  "children":
  [
    {
      "text":"Ax",
      "children":[]
    },
    {
      "text":"Ay",
      "children":
      [
        {
          "text":"Ay2",
          "children":[]
        }
      ]
    }
  ]
}

(следующая запись)

{
  "text":"B",
  "children":
  [
    {
      "text":"Bx",
      "children":[]
    }
  ]
}

Таблица содержит несколько сотен тысяч записей, и я не могу сделать предположениенасколько глубоко это повторяется, поскольку это может измениться, прежде чем я наконец запустил его.Я пытался использовать WITH, чтобы попытаться объединить дочерние записи, но я действительно изо всех сил.Можно ли это сделать с помощью СО или есть другой способ?

Ответы [ 2 ]

2 голосов
/ 05 января 2011

В конце я пошел с рекурсивной функцией sql с курсором, который объединяет результаты каждого рекурсивного вызова. Другая функция sql экранирует строки, которые входят в json, чтобы убедиться, что там нет никаких неприятных символов.

Эта последняя функция основана на некотором коде в ссылке @Martin, приведенной в комментариях выше: http://www.simple -talk.com / sql / t-sql-программирования / consuming-json-strings-in- SQL-сервер /

Я обычно держусь подальше от курсоров, но так как это скрипт переноса данных, он оказался самым простым способом продвижения вперед

0 голосов
/ 26 октября 2012

Немного сложно делать такие вещи в SQL, так как он ожидает возврата набора строк (то есть: сетки или таблицы). Если вы используете PL / SQL или другой процедурный язык, встроенный в sql, вы можете приблизить его, но лучшим решением будет вызов операторов SQL из скрипта или другого кода, как вы это сделали.

PS: Курсоры очень полезны, как только вы к ним привыкнете. Думайте о них как о цикле: в каждом ряду вы можете выполнять некоторую логику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...