Когда я выполняю плоский запрос для адреса 2, поскольку одна запись содержит массив, я получаю только третью запись
поведение по умолчанию табличной функции FLATTEN
в Snowflake пропустит все столбцы, у которых нет структуры для расширения, и аргумент OUTER
управляет этим поведением. Цитирование соответствующей части из ссылки на документацию выше (выделено мной):
OUTER
=> TRUE
| FALSE
Если FALSE
, любые входные строки , которые не могут быть расширены , либо потому, что к ним нельзя получить доступ в пути, либо потому, что у них нет полей или записей, являются полностью опущено из вывода .
Если TRUE
, для расширений с нулевой строкой создается ровно одна строка (с NULL
в столбцах KEY
, INDEX
и VALUE
).
По умолчанию: FALSE
Поскольку ваши данные VARIANT
имеют странную форму, вам необходимо использовать условные выражения * Предикаты типа данных 1041 * и , чтобы проверить, имеет ли столбец в развернутой строке тип ARRAY
, VARCHAR
или что-то еще, и использовать результат для выдачи правильного значения.
Пример запроса, иллюстрирующий использование всего вышеперечисленного:
SELECT
t.v:address.City AS city
, t.v:address.Address1 AS address1
, CASE
WHEN IS_ARRAY(t.v:address.Address2) THEN f.value:txtvalue::string
ELSE t.v:address.Address2::string
END AS address2
FROM
add1 t
, LATERAL FLATTEN(INPUT => v:address.Address2, OUTER => TRUE) f;
Ps Рассмотрите возможность стандартизации входных данных при захвате или источнике, чтобы снизить сложность запроса.
Примечание: Ваш пример данных несовместим (массив объектов не имеет однородных ключей), bu Следуя вашему примеру запроса, я предположил, что все ключи объектов в массиве будут называться txtvalue
.