2014-11-18 4 views
1

Допустим, у меня есть поля столбцов JSON, например, так:Проверьте тип значения значения JSON в Postgres

{phone: 5555555555, address: "55 awesome street", hair_color: "green"} 

То, что я хотел бы сделать, это обновление записи, где ключ JSON телефон присутствует, и результатом является номер типа, который является строкой.

Что у меня есть:

SELECT * 
FROM parent_object 
WHERE (fields->'phone') IS NOT NULL; 

К сожалению, это все еще возвращает значения, где это phone:null. Я предполагаю, что JSON null не эквивалентен SQL NULL.

Как я 1) Как я исключаю JSON аннулирует AND (fields->'phone') <> null производит

LINE 4: ...phone') IS NOT NULL AND (fields->'phone') <> 'null'; 
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 

2) Проверьте тип значения в этом ключе, этот псевдокод (type_of (fields->'phone') == Integer), но в рабочем PGSQL.

3) Изменить это, чтобы обновить столбец

UPDATE parent_object 
SET fields.phone = to_char(fields.phone) 
WHERE query defined above 
+0

Try 'НЕ NULL' вместо' NULL' –

+0

<>, который фиксирует первый из моих проблем. Спасибо. Я переписал вопрос, чтобы не путать людей. Любые мысли о двух других? –

+0

Почему вы пытаетесь преобразовать телефон в целое? Значение 5555555555, например, ** не ** целое, поскольку оно превышает предел (2^31) -1. –

ответ

1
  1. Как и другие люди сказали, что нет никаких причин, чтобы преобразовать переменную в целое число раз, чтобы им бросить его в строку. Кроме того, номера телефонов не являются номерами. :-)

  2. Вы должны использовать оператор ->> вместо ->. Это вместе с IS NOT NULL получает ваш запрос SELECT.

    Обратите внимание на различие между этими двумя значениями кортежа после выполнения этого запроса:

    SELECT fields->'phone', fields->>'phone' 
    FROM parent_object; 
    

    Ваш рабочий запрос:

    SELECT * 
    FROM parent_object 
    WHERE (fields->>'phone') IS NOT NULL; 
    
  3. Postgres в настоящее время не встроена поддержка атомарного обновления отдельных ключей в столбце JSON , Вы можете написать обертку UDF, чтобы предоставить эту возможность вам: How do I modify fields inside the new PostgreSQL JSON datatype?

Смежные вопросы