#postgresql
#postgresql
Вопрос:
select id, cast((nd -gt;gt; 'bath') as float) as bath, cast((nd -gt;gt; 'bed') as integer) as bed, cast(ndp as NUMERIC) as price , FIRST_VALUE(cast((nd -gt;gt; 'bed') as integer)) OVER( ORDER BY cast((nd -gt;gt; 'bed') as integer)) priority_bed, FIRST_VALUE(cast((nd -gt;gt; 'bath') as float)) OVER( ORDER BY cast((nd -gt;gt; 'bath') as float)) priority_bath FROM properties p cross join lateral jsonb_array_elements(p.bed_bath_price) as nd cross join lateral jsonb_array_elements(nd -gt; 'price') as ndp
Я использую postgres 13,и приведение(ndp как числовое) работает просто отлично, но в postgres 12 оно дает не может привести jsonb к нулю …..
Комментарии:
1. Вы можете попробовать
join lateral jsonb_array_elements(nd -gt;gt; 'price') as ndp
, чтобы ndp был текстом, а не jsonb2. @Эдуард, вернее, не совсем
cross join lateral jsonb_array_elements_text(nd -gt; 'price') as ndp
так .3. @Stefanov.sm, да, вы, конечно, правы … Я немного поторопился, извини
4. @Эдуард Ура!
Ответ №1:
Вы также не можете преобразовать значение JSONB null в числовое значение в v13. Разница должна заключаться в самих данных, а не в версии запущенной вами базы данных.
Вы могли бы написать что-то подобное case when jsonb_typeof(ndp)lt;gt;'null' then ndp::numeric end
или определить функцию для инкапсуляции , если вы будете часто это делать.