我有一张人的桌子。每个人可以有几个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。有什么想法吗?
答案 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