PostgreSQL文本数组 - 查询为整数,忽略非数字

时间:2016-11-15 05:09:17

标签: sql postgresql postgresql-9.4

我有一张人的桌子。每个人可以有几个regnums(大多数是整数,但有些像M / 2344和W345)。为了使事情变得更复杂,有NULL,空格和字符串,如' NA'。由于其不可预测的构成,regnums存储在文本数组字段中(例如{12345,M / 2344}和{3459,NA})。

因为大多数的人都有可以被视为整数的定点,所以我希望能够在这个领域做一些事情,比如在491555和491685之间找到一个有一个区域的人。

我试过了:

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

但结果包括超出范围的限制,例如49162.我认为这是因为unnested regnum字段仍然是文本字段(?)

我还尝试将regnum作为整数字段投射 - unnest(regnum::integer[]) - 但我收到错误: Error in query: ERROR: invalid input syntax for integer: "NA"

我认为我在正确的轨道上,但我不知道如何忽略非类似intn的regnums。有什么想法吗?

1 个答案:

答案 0 :(得分: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