В PostgreSQL у меня есть таблица со столбцом varchar. Данные должны быть целыми числами, и мне они нужны в запросе целочисленным типом. Некоторые значения представляют собой пустые строки. Последующий:
SELECT myfield::integer FROM mytable
доходность ERROR: invalid input syntax for integer: ""
Как я могу запросить приведение и получить 0 в случае ошибки во время приведения в postgres?
источник
E'\\d{1,5}$'
.{1,5}
выше предел @ Bobort для цифр, возможно, является хорошей идеей, если вы беспокоитесь о переполнении, но он замаскирует большие числа, что может вызвать проблемы при преобразовании таблицы. Лично я предпочел бы заранее сообщить об ошибке запроса и знать, что некоторые из моих "целых чисел" ненадежны (вы также можете выбрать с помощьюE'\\d{6,}$'
сначала, чтобы убедиться).Вы также можете создать свою собственную функцию преобразования, внутри которой вы можете использовать блоки исключений:
Тестирование:
источник
INSERT
заявлении?У меня была такая же потребность, и я обнаружил, что это хорошо работает для меня (postgres 8.4):
Некоторые тестовые примеры для демонстрации:
Если вам нужно обработать возможность того, что поле имеет нечисловой текст (например, «100bad»), вы можете использовать regexp_replace для удаления нечисловых символов перед преобразованием.
Тогда значения text / varchar, такие как "b3ad5", также будут давать числа
Чтобы решить проблему Криса Когдона по поводу того, что решение не дает 0 для всех случаев, включая такой случай, как «плохой» (вообще нет цифровых символов), я сделал это скорректированное заявление:
Он работает аналогично более простым решениям, за исключением того, что он будет давать 0, когда значение для преобразования состоит только из нецифровых символов, например "плохо":
источник
Это может быть чем-то вроде взлома, но в нашем случае он сделал свою работу:
Объяснение (проверено на Postgres 8.4):
Вышеупомянутое выражение дает
NULL
значения NULL в пустых строкахmyfield
и0
для пустых строк (это точное поведение может соответствовать вашему варианту использования, а может и не соответствовать).Данные испытаний:
Запрос даст следующий результат:
В то время как select only
values::integer
приведет к сообщению об ошибке.Надеюсь это поможет.
источник
SELECT CASE WHEN myfield="" THEN 0 ELSE myfield::integer END FROM mytable
Я никогда не работал с PostgreSQL, но я проверил руководство на предмет правильного синтаксиса операторов IF в запросах SELECT.
источник
@ Мэтью хорошо ответил . Но это может быть проще и быстрее. И вопрос просит преобразовать пустые строки (
''
)0
, но не в другой "недопустимый синтаксис ввода" или ввод "вне диапазона":Это возвращается
0
для пустой строки иNULL
для любого другого недопустимого ввода.Его легко адаптировать для преобразования любого типа данных. .
Ввод блока исключений существенно дороже. Если часто встречаются пустые строки, имеет смысл перехватить этот случай, прежде чем вызывать исключение.
Если пустые строки встречаются очень редко, стоит перенести тест в условие исключения.
источник
Эта функция всегда будет возвращать,
0
если во входной строке нет цифр.SELECT parse_int('test12_3test');
вернется
123
источник
Я нашел следующий код простым и работающим. Оригинальный ответ здесь https://www.postgresql.org/message-id/371F1510.F86C876B@sferacarta.com
Надеюсь, поможет
источник
SUBSTRING может помочь в некоторых случаях, вы можете ограничить размер int.
источник
Если данные должны быть целыми числами, и вам нужны только эти значения как целые числа, почему бы вам не пройти всю милю и не преобразовать столбец в целочисленный столбец?
Затем вы можете выполнить это преобразование недопустимых значений в нули только один раз в той точке системы, где данные вставляются в таблицу.
С помощью приведенного выше преобразования вы заставляете Postgres преобразовывать эти значения снова и снова для каждой отдельной строки в каждом запросе этой таблицы - это может серьезно снизить производительность, если вы выполняете много запросов к этому столбцу в этой таблице.
источник
Следующая функция выполняет
error_result
) для неприводимых результатов, например,abc
или999999999999999999999999999999999999999999
null
какnull
bigints
, сравниваются,lower_bound
например, с принудительным применением только положительных значенийисточник
У меня тоже есть такая же потребность, но она работает с JPA 2.0 и Hibernate 5.0.2:
Творит чудеса. Я думаю, что это работает и с LIKE.
источник
Это также должно работать, но это относится к SQL, а не к postgres.
источник