Postgres Varchar поле между - PullRequest
       17

Postgres Varchar поле между

1 голос
/ 10 июня 2010

У меня есть таблица адресов с полем почтового индекса типа VARCHAR.Мне нужно выбрать все адреса из этой таблицы, используя диапазон почтовых индексов.Если я использовал следующий код:

select * from address where cast(zip as bigint) between 90210 and 90220

Я получаю сообщение об ошибке в полях, где почтовый индекс не может быть приведен как bigint.

Как мне решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 10 июня 2010

Ошибка очевидна: у вас есть несколько почтовых адресов, не представляющих число.Например, буквы или тире.Если вы хотите интерпретировать их как числа, вы должны избавиться от тех, которые не состоят из цифр ... если это действительно вас устраивает.Посмотрите ответ Аракнида на некоторые рецепты.Но сначала спросите себя: если у вас есть какой-нибудь почтовый магазин с номером 123-34, как вы хотите их интерпретировать, возможно, вам нужно переосмыслить формат и тип данных.

0 голосов
/ 10 июня 2010

Если у вас только почтовые индексы США, то, вероятно, у вас должно быть два столбца типа int, таких как zip и plus_4.Но простой ответ на ваш вопрос - просто сравнить varchar.Вероятно, у вас уже есть индексированный столбец zip, поэтому он все равно будет работать достаточно хорошо.

SELECT * FROM address WHERE zip BETWEEN '90210' AND '90220'
0 голосов
/ 10 июня 2010

Получите версию zip-столбца, которая представляет собой bigint, если значение zip является числовым, и ноль в противном случае, а затем проверьте это.

Так что, как

select * from address
where case when zip ~ '^[0-9]+$' then cast(zip as bigint) end between 90210 and 90220

Чтобы сделать этот запрос эффективным, вы можете создать индекс для этого выражения:

create index address_zip_idx on address(cast(zip as bigint)) where zip ~ '^[0-9]+$';
-- this query can now use that index
select * from address
where zip ~ '^[0-9]+$' and cast(zip as bigint) between 90210 and 90220;
...