Снежинка - Вариант Приведения к Плаванию с возможными пустыми строками - PullRequest
0 голосов
/ 22 апреля 2020

Я прочесал документы, но не могу найти более простой способ конвертировать один из наших запросов T- SQL в Snowflake. Я пытаюсь разобрать значение в JSON, привести его как число с плавающей точкой, и, если значение является пустой строкой, присвоить его нулю.

В T- SQL это:

cast(JSON_VALUE(fieldName, '$."json.path.to.value"') as float)

В Snowflake пустая строка выдаст ошибку, поэтому вам нужно использовать попытку приведения. Попытка приведения не поддерживает вариант, только строку. Если попытка не удалась, она возвращает ноль. Итак, я получаю что-то вроде этого:

coalesce(try_to_double(to_varchar(parse_json(fieldName):"json.path.to.value")),0)

Это работает, но четыре вложенные функции кажутся немного законченными. Есть ли более простой способ для этого?

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Предполагая, что fieldName уже является VARIANT, тогда вам не нужно parse_json. И я бы сократил все до:

SELECT IFNULL(TRY_TO_DOUBLE(fieldName:path:to:value::varchar),0)
FROM ... ;
0 голосов
/ 22 апреля 2020

Учитывая, что T- SQL равен трем, четыре шага кажутся нормальными.

Я бы поменял to_varchar() на ::text, как

coalesce(try_to_double(parse_json(fieldName):"json.path.to.value"::text),0)

также на json вопрос, если ваш объект выглядит так:

{
   "json.path.to.value":10
}

, тогда у вас будет работать форма, но если у вас есть вложенные объекты, такие как:

{
    json:{
        path:{
            to:{
                value:66
            }
        }
    }
}

, вам понадобится parse_json(fieldName):json.path.to.value::text

, как видно из:

select 
   coalesce(try_to_double(to_varchar(parse_json(fieldName):"json.path.to.value")),0)
   ,coalesce(try_to_double(parse_json(fieldName):"json.path.to.value"::text),0)
   ,coalesce(try_to_double(parse_json(fieldName):json.path.to.value::text),0)
from values 
   ('{"json.path.to.value":0.1}'), 
   ('{"json.path.to.value":10}'),
   ('{"json.path.to.value":"not a float"}'),
   ('{json:{path:{to:{value:66}}}}'),
   ('{"different_field_name":51}')
   v(fieldName);

дает:

0.1 0.1 0
10  10  0
0   0   0
0   0   66
0   0   0
...