sql - 使用 CAST 和 SUBSTRING 时如何在 postgresql 中过滤查询结果 (pgAdmin 4)

标签 sql postgresql

我是 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/

相关文章:

sql - oracle中的max(rowid)是什么

SQL交叉查询

sql - GROUP BY 列相等或为 NULL 的连续行

php - 为 SilverStripe 网站添加只读副本

sql - TSQL,如何避免 if 条件?

sql - 在postgresql中的两个用户之间的对话中获取最新消息

c# - 使用 SQL 更新 250k 行的更快方法

spring - 如何在 r2dbc-postgresql 中使用 EnumCodec

PHP 从 Postgres 意外字符中选择

sql - 查询包含 JSON 对象数组的 jsonb 列