2016-11-15 231 views
0

我有一张人的表。每个人可以有几个regnums(主要是整数,但有些像M/2344和W345)。为了使事情更复杂一些,有NULL,空白和像'NA'这样的字符串。由于其不可预知的组成,所述规则被存储在文本数组字段中(例如{12345,M/2344}和{3459,NA})。PostgreSQL文本数组 - 查询为整数,忽略非数字

因为人都可以被视为整数regnums,我希望能够做的事情与此字段一样找人带491555和491685.

我之间,说,REGNUM已经试过:

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

但结果包括外的范围regnums,例如49162我想这是因为嵌套的REGNUM领域仍然是一个文本字段

我也试着铸造REGNUM为整场 - unnest(regnum::integer[]) - 但我得到的错误(?): Error in query: ERROR: invalid input syntax for integer: "NA"

我认为我在正确的轨道上,但我不知道如何忽略非整型的regnums。有任何想法吗?

+0

我不知道PostgreSQL有这个能力,但我会尝试设置一个'CASE'为其中列的值是测试的选择的部分,如果它是一个数字,如果是,则返回数量,否则返回一个非常大的数字(这将不会被包括在范围内,或任何其他排除价值E)。 – FDavidov

+0

谢谢@FDavidov。我想它会来CASE,但我不能完全正确。 – 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