Предположим, у меня есть таблица с несколькими столбцами. Один из столбцов называется Details
, имеет тип dynamic
и представляет собой массив объектов JSON, подобных этому:
[
{
"key": "Name",
"value": "Dave"
},
{
"key": "Age",
"value": "30"
},
{
"key": "Gender",
"value": "Male"
}
]
Я хотел бы эффективно извлечь value
из объекта, который имеет key
= Gender
, и сохранить его в новом поле под названием Gender
. Однако объект с этим ключом не всегда будет находиться в поле, и в этом случае я хочу установить для него значение по умолчанию Undefined
в моем извлеченном свойстве.
Итак, если бы у меня было:
datatable(d:dynamic)
[
dynamic({
"Details":[
{"value":"Dave","key":"Name"},
{"value":"Male","key":"Gender"},
{"value":"30","key":"Age"}
]
}),
dynamic({
"Details":[
{"value":"Dan","key":"Name"},
{"value":"40","key":"Age"}
]
}),
]
Я бы хотел, чтобы мои две строки были:
Gender
------
Male
Undefined
Набор данных, который будет запрошен, будет иметь возраст до года и может содержать миллион строк, что может повлиять на подход.
Мне известны mv-extend
и mv-apply
, но я не думаю, что они сработают, поскольку при принятии решения о назначении значения по умолчанию или нет необходимо учитывать все содержимое массива.
Спасибо :)
ниже приведены два варианта, вы можете проверить, как они работают в вашем случае использования и соответствуют ли они вашим требованиям.
Обратите внимание, что если это общее требование к запросу, вы можете извлечь эту информацию во время приема, например. используя «сопоставление приема» или «политику обновления».
datatable(d:dynamic)
[
dynamic({
"Details":[
{"value":"Dave","key":"Name"},
{"value":"Male","key":"Gender"},
{"value":"30","key":"Age"}
]
}),
dynamic({
"Details":[
{"value":"Dan","key":"Name"},
{"value":"40","key":"Age"}
]
}),
]
| project Gender = case (d !has 'Gender', 'Unknown', extract(@'{"value":"([^"]+)","key":"Gender"}', 1, tostring(d)))
datatable(d:dynamic)
[
dynamic({
"Details":[
{"value":"Dave","key":"Name"},
{"value":"Male","key":"Gender"},
{"value":"30","key":"Age"}
]
}),
dynamic({
"Details":[
{"value":"Dan","key":"Name"},
{"value":"40","key":"Age"}
]
}),
]
| mv-apply details = d.Details on (
summarize arr = make_set_if (details.value, details.key == "Gender")
| project Gender = case(isnotnull(arr[0]), tostring(arr[0]), "Undefined")
)
| project Gender
Спасибо! Мне нужны были функции
make_set_if ()
иcase()
. Я тоже рассматривал регулярное выражение, но чувствовал, что должен быть более красноречивый способ сделать это, поскольку многие журналы Azure структурированы именно так. Мне вполне комфортно работать с Regex, и я вполне рад использовать его там, где это необходимо, но я также осознаю мудрость использования регулярного выражения для решения проблемы — теперь у вас есть две проблемы.