2016-11-15 6 views
0

У меня есть таблица людей. Каждый человек может иметь несколько regnums (в основном целые числа, но некоторые вроде M/2344 и W345). Чтобы сделать вещи немного сложнее, есть NULL, пустые и строчные строки, такие как «NA». Из-за их непредсказуемой композиции регионы хранятся в поле текстового массива (например, {12345, M/2344} и {3459, NA}).Текстовый массив PostgreSQL - запрос как целое, игнорируя цифры

Поскольку большинство людей regnums, которые могут быть обработаны как целые числа, я хотел бы быть в состоянии сделать что-то с этим полем, как найти людей, с между ИА REGNUM, скажем, 491555 и 491685.

Я пробовал:

SELECT id,forename,surname,regnum FROM (SELECT *, unnest(regnum) reg FROM people) as TBL WHERE reg BETWEEN '491555' AND '491685';

но результаты включают в себя вне допустимого диапазона regnums, например, 49162. Я предполагаю, что это потому, что безгнездное поле ИА REGNUM еще текстовое поле

Я также попытался литье Регнума как целое поле - unnest(regnum::integer[]) - но я получаю ошибки (?): Error in query: ERROR: invalid input syntax for integer: "NA"

I думаю, что я на правильном пути, но я не понимаю, как игнорировать не-int-like regnums. Есть идеи?

+0

Я не знаю, если PostgreSQL имеет эту возможность, но я хотел бы попробовать установки 'CASE' как часть выбора, где проверяется значение столбца, если это число и: Если да, то возвращение число, в противном случае возвращает очень большое число (которое никогда не будет включено в диапазон или любую другую исключающую стоимость е). – FDavidov

+0

Спасибо @FDavidov. Я решил, что это придет к делу, но я не мог понять все правильно. – Greg

ответ

0

Вы можете проверить, если текстовое значение состоит только из цифр, проверив его с регулярным выражением, например:

SELECT '1234' ~ '^[0-9]+$' -- true 
SELECT 'NA' ~ '^[0-9]+$' -- false 

Таким образом, в вашем случае вам нужно отливать значение в целое, только если это числовое:

WHERE (CASE WHEN reg ~ '^[0-9]+$' THEN reg::integer ELSE null END) BETWEEN 491555 AND 491685 
+0

Отлично! Я буквально копировал/вставлял и обрабатывал удовольствие. Спасибо @pumbo. – Greg