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

PostgreSQL text array - query as integer, ignoring non-digits

我有一 table 人。每个人可以有多个 regnums(主要是整数,但有些像 M/2344 和 W345)。为了让事情变得更复杂一些,还有 NULL、空值和像 'NA' 这样的字符串。由于其不可预测的table 组合,regnums 存储在文本数组字段中(例如 {12345,M/2344} 和 {3459,NA})。

因为 大多数 人的 regnum 可以被视为整数,我希望能够用这个字段做一些事情,比如找到 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 字段仍然是文本字段(?)

我也尝试过将 regnum 转换为整数字段 - unnest(regnum::integer[]) - 但出现错误: Error in query: ERROR: invalid input syntax for integer: "NA"

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

您可以使用正则表达式检查文本值是否仅由数字组成,如下所示:

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