【问题标题】:peewee complex query with case and if带有大小写和 if 的 peewee 复杂查询
【发布时间】:2017-09-18 22:27:06
【问题描述】:

我有一张供志愿者使用的 ROTA 表:

dater      |   vol1id   |  vol2id   |  vol3id  |   vol4id
-----------+------------+-----------+----------+-----------
2017-08-01 |  1         |  13       |  14      |  33 
2017-08-02 |  32        |  150      |  3       |  4

其中一个旧查询会检查当天有多少志愿者已经起床,因此它会显示在 HTML 表格中,颜色取决于可用性。这样做是这样的:

SELECT
    (CASE WHEN vol1id IS NULL THEN 0 ELSE 1 END) + 
    (CASE WHEN vol2id IS NULL THEN 0 ELSE 1 END) + 
    (CASE WHEN vol3id IS NULL THEN 0 ELSE 1 END) +
    (CASE WHEN vol4id IS NULL THEN 0 ELSE 1 END) 
FROM rotas 
WHERE (dater BETWEEN '2017-08-01' AND '2017-08-31')
ORDER BY dater;

我想把这个SQL查询转换成peewee过滤,可以用peewee做吗?

【问题讨论】:

    标签: peewee


    【解决方案1】:

    嗯,我做了一些研究,但无法成功。所以我采取了另一种策略,并将其移到一个函数中,只计算字段的数量 NOT NULL。

    CREATE OR REPLACE FUNCTION count_volunteers(start_date date, end_date date)
      RETURNS TABLE (day date, volunteer_count bigint) AS
    $func$
    SELECT
       dater,
       (SELECT COUNT(*)
       FROM (values (T.vol1id), (T.vol2id), (T.vol3id), (T.vol4id)) AS v(col)
          WHERE v.col IS NOT NULL) 
       FROM rotas as T
       WHERE (dater BETWEEN start_date AND end_date)
       ORDER BY dater;
    $func$
    LANGUAGE sql;
    

    现在更容易了,因为它现在只是以这种方式添加查询:

    SELECT day, volunteer_count FROM count_volunteers('2017-08-01', '2017-08-31');
    

    peewee 现在可以轻松使用它了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多