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
我有一 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