我是 SQL 新手,有一个表,其中包含一个由数字和文本组成的字符串(例如,“10 Windows”)。从这个表中,我需要从字符串中提取出“10”并将其作为整数移动到一个新列中(我使用的是 pgAdmin4)
我能够编写查询来解析字符串中的数字并将它们作为整数返回到新列。
SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num
FROM events
从这里,我可以将 data1 中字符串中的数字作为整数放入名为 data1_num 的列中。
但是,如果我想通过下面的查询过滤以查找 data1_num = 27 的所有行,则会出现错误。
SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num
FROM events
WHERE data1_num = 27
错误:
ERROR: column "data1_num" does not exist
LINE 3: WHERE data1_num = 27
^
********** Error **********
ERROR: column "data1_num" does not exist
SQL state: 42703
Character: 205
我错过了什么吗?
我觉得这应该可行,即使 data1_num 为 27 的行为零,我也不应该收到错误。
最佳答案
即使您的 SELECT
子句首先出现在查询中,它实际上也是在 WHERE
子句之后求值的。那是标准的 SQL。这意味着您无法访问 SELECT
上的计算列(或列别名)。
试试这个:
SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num
FROM events
WHERE CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) = 27 ;
注意:不要担心表达式被计算两次。由数据库来优化它。
如果你还是担心,你可以用这个:
SELECT
*
FROM
(
SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num
FROM events
) AS q
WHERE data1_num = 27 ;
引用资料:
关于sql - 使用 CAST 和 SUBSTRING 时如何在 postgresql 中过滤查询结果 (pgAdmin 4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45342927/