У мене була така ж потреба, і я виявив, що це працює добре для мене (postgres 8.4):
CAST((COALESCE(myfield,'0')) AS INTEGER)
Деякі тестові приклади для демонстрації:
db=> select CAST((COALESCE(NULL,'0')) AS INTEGER);
int4
------
0
(1 row)
db=> select CAST((COALESCE('','0')) AS INTEGER);
int4
------
0
(1 row)
db=> select CAST((COALESCE('4','0')) AS INTEGER);
int4
------
4
(1 row)
db=> select CAST((COALESCE('bad','0')) AS INTEGER);
ERROR: invalid input syntax for integer: "bad"
Якщо вам потрібно обробити можливість поля, що має нечисловий текст (наприклад, "100bad"), ви можете використовувати regexp_replace, щоб викреслити нечислові символи перед виведенням.
CAST(REGEXP_REPLACE(COALESCE(myfield,'0'), '[^0-9]+', '', 'g') AS INTEGER)
Тоді значення тексту / varchar типу "b3ad5" також дасть числа
db=> select CAST(REGEXP_REPLACE(COALESCE('b3ad5','0'), '[^0-9]+', '', 'g') AS INTEGER);
regexp_replace
----------------
35
(1 row)
Щоб вирішити стурбованість Кріса Когдона тим, що рішення не дає 0 для всіх випадків, включаючи такий випадок, як "поганий" (немає жодних знаків), я зробив цю коригувану заяву:
CAST((COALESCE(NULLIF(REGEXP_REPLACE(myfield, '[^0-9]+', '', 'g'), ''), '0')) AS INTEGER);
Він працює аналогічно більш простим рішенням, за винятком того, що дасть 0, коли значення для перетворення - це лише нецифрові символи, наприклад "погано":
db=> select CAST((COALESCE(NULLIF(REGEXP_REPLACE('no longer bad!', '[^0-9]+', '', 'g'), ''), '0')) AS INTEGER);
coalesce
----------
0
(1 row)