выберите рекурсивный и упорядочите по

Я использую приведенный ниже запрос для выбора рекурсивного сверху вниз
например,
Если tagId равно 1, будут получены строки, 1 > 3,4, > 5 теперь работает нормально,
но я хочу знать, как получить порядок результатов по «Имени» на каждом уровне ( тот же родительский идентификатор) получить строки 1 > 4,3 > 5?

Я пробовал добавлять ORDER BY "Name" после SELECT * FROM "Tag" WHERE "TagId" = $1, но не работало.
и если добавить после SELECT * FROM tag_tree, уровень беспорядка станет 1,4,5,3 не тем, что я хочу.

CREATE TABLE IF NOT EXISTS "Tag"(
"TagId" SERIAL NOT NULL,
"ParentTagId" integer,
"Name" varchar,
PRIMARY KEY ("TagId")
);

TagId | ParentTagId | Name |
1     |             | a   |
2     |             | b   |
3     | 1           | b   |
4     | 1           | a   |
5     | 3           | a   |


var query = 'WITH RECURSIVE tag_tree AS (
  (
    SELECT * FROM "Tag" WHERE "TagId" = $1
  )
  UNION ALL
  SELECT child.* FROM "Tag" child
    JOIN tag_tree parent on parent."TagId" = child."ParentTagId"
)
SELECT * FROM tag_tree';

person Community    schedule 31.10.2015    source источник


Ответы (1)


Добавьте ORDER BY к coalesce():

WITH RECURSIVE tag_tree AS (
  (
    SELECT * FROM "Tag" WHERE "TagId" = 1
  )
  UNION ALL
  SELECT child.* FROM "Tag" child
    JOIN tag_tree parent on parent."TagId" = child."ParentTagId"
)
SELECT * FROM tag_tree
ORDER BY coalesce("ParentTagId", 0), "Name";

 TagId | ParentTagId | Name 
-------+-------------+------
     1 |             | a
     4 |           1 | a
     3 |           1 | b
     5 |           3 | a
(4 rows)

Для документации:

Функция COALESCE возвращает первый из своих аргументов, который не равен нулю. Null возвращается, только если все аргументы равны null. Он часто используется для замены нулевых значений значением по умолчанию, когда данные извлекаются для отображения.

В этом случае функция меняет null на 0.

person klin    schedule 31.10.2015
comment
что означает 0?? - person ; 31.10.2015