Я думаю, что вам нужен метод безопасного чтения для свойства в object
. Вы можете создать метод, который получает object
и key
и безопасно читает это свойство, связывающее проверки. Примеры цепочек, которые вы можете использовать, чтобы подойти к этому:
obj && obj.key ? obj.key : "N/A"
или
(obj || {}).key || "N/A"
или
obj && obj.key || "N/A"
И в будущем (надеюсь, не так долго ) может быть, вы можете использовать следующий:
obj?.key || "N/A"
Наконец, минимальным примером общего метода безопасного чтения может быть:
[1117 ]
let obj1 = null;
let obj2 = {};
let obj3 = {name: ""}
let obj4 = {name: "John"}
const safeReadObj = (obj, key) => obj && obj[key] || "N/A";
// Test cases:
console.log(safeReadObj(obj1, "name"));
console.log(safeReadObj(obj2, "name"));
console.log(safeReadObj(obj3, "name"));
console.log(safeReadObj(obj4, "name"));
Use CTE
's.
Given the tree-like table structure:
id parent name
1 0 Electronics
2 1 TV
3 1 Hi-Fi
4 2 LCD
5 2 Plasma
6 3 Amplifiers
7 3 Speakers
, this query will return id
, parent
and depth level, ordered as a tree:
WITH v (id, parent, level) AS
(
SELECT id, parent, 1
FROM table
WHERE parent = 0
UNION ALL
SELECT id, parent, v.level + 1
FROM v
JOIN table t
ON t.parent = v.id
)
SELECT *
FROM v
id parent name
1 0 Electronics
2 1 TV
4 2 LCD
5 2 Plasma
3 1 Hi-Fi
6 3 Amplifiers
7 3 Speakers
Replace parent = 0
with parent = @parent
to get only a branch of a tree.
Provided there's an index on table (parent)
, this query will efficiently work on a very large table, since it will recursively use INDEX LOOKUP
to find all chilrden for each parent.
To update a certain branch, issue:
WITH v (id, parent, level) AS
(
SELECT id, parent, 1
FROM table
WHERE parent = 0
UNION ALL
SELECT id, parent, v.level + 1
FROM v
JOIN table t
ON t.parent = v.id
)
UPDATE table t
SET column = newvalue
WHERE t.id IN
(
SELECT id
FROM v
)
where @parent
is the root of the branch.
Посмотрите книгу Джо Селко о деревьях и иерархиях , чтобы узнать о нескольких способах решения проблемы иерархии. Модель, которую вы выберете, будет зависеть от того, как вы оцениваете поиск, обновления и сложность. Вы можете выполнять поиск довольно быстро (особенно для получения всех дочерних узлов в узле), используя модель списка смежности, но обновление дерева происходит медленнее.
Сначала вы должны задать себе следующие вопросы: 1) Каково соотношение модификаций и прочтений? (= в основном статичное дерево или постоянно меняется?) 2) Насколько глубоко и насколько велико, по вашему мнению, вырастет дерево?
Вложенные наборы отлично подходят для в основном статических деревьев, когда вам нужны операции с целыми ветвями. Он без проблем обрабатывает глубокие деревья.
Материализованный путь хорошо работает для динамических (изменяющихся) деревьев с ограниченной / предсказуемой глубиной.
Рекурсивные CTE идеальны для очень маленьких деревьев, но операции ветвления («получить всех дочерних элементов в этой ветви» .. ") получить очень дорого с глубоким / большим деревом.
Если у вас много обновлений и выборок, лучше всего вариант, похоже, представляет собой модель перечисления путей, которая кратко описана здесь:
http://www.sqlteam.com/article/more-trees-hierarchies-in-sql