0

是否可以根据“案例值”创建选择。在下面的例子中Category。假设我想获得Low价值。当我使用时它会抛出一个错误WHERE Category = 'Low',因为该列Category不存在。

我知道我可以通过替换来创建WHERE Category = 'Low'选择Where digit > 0 AND digit <=40。但这似乎是一种不好的方法,因为没有双重表达。

SELECT digits,

    CASE 
        When digit > 0 AND digit <=40 THEN 'Low'
        When digit > 40 AND digit <=75 THEN 'Average'
        When digit > 75  THEN 'High'
    END AS Category

FROM digits_table

WHERE Category  = 'Low'
4

3 回答 3

2

您可以使用 with 语句:

WITH tmp as (
SELECT digits,

CASE 
    When digit > 0 AND digit <=40 THEN 'Low'
    When digit > 40 AND digit <=75 THEN 'Average'
    When digit > 75  THEN 'High'
END AS Category

FROM digits_table
)
select * from tmp where category = 'Low'
于 2013-10-21T06:56:17.480 回答
1

或者(老派):

SELECT * FROM (
    SELECT digits,
    CASE 
        When digit > 0 AND digit <=40 THEN 'Low'
        When digit > 40 AND digit <=75 THEN 'Average'
        When digit > 75  THEN 'High'
    END AS Category
    FROM digits_table
) AS tmp WHERE Category = 'Low'
于 2013-10-21T07:43:03.327 回答
1

使用 PSQL 9.2+,您可以使用Range 类型Range 函数和运算符

tl;博士;

select * from digits_table where digits <@ int4range(0, 40, '(]');

长版

考虑这张表:

postgres=# select * from tests;
 id | digit 
----+-------
  1 |    10
  2 |    20
  3 |    30
  4 |    40

您可以查询(注意这里的 int4range 下限是包含的,而上限是独占的):

postgres=# select * from tests where digit <@ int4range(20,40);
 id | digit 
----+-------
  2 |    20
  3 |    30

当然,您可以将字符串转换为所需的输入/排除模式(只需像通常在数学课上所做的那样将其放下,然后转换为范围类型):

postgres=# select * from tests where digit <@ '(20,40]'::int4range;
 id | digit 
----+-------
  3 |    30
  4 |    40

postgres=# select * from tests where digit <@ '[20,40]'::int4range;
 id | digit 
----+-------
  2 |    20
  3 |    30
  4 |    40

有一种更简单但更明确的方式来控制边界(这是 PostgreSQL,宝贝!):

postgres=# select * from tests where digit <@ int4range(20,40,'[]');
 id | digit 
----+-------
  2 |    20
  3 |    30
  4 |    40

postgres=# select * from tests where digit <@ int4range(20,40,'()');
 id | digit 
----+-------
  3 |    30

postgres=# select * from tests where digit <@ int4range(20,40,'[)');
 id | digit 
----+-------
  2 |    20
  3 |    30
于 2013-10-21T13:10:42.263 回答