AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 89216
Accepted
Alexis
Alexis
Asked: 2015-01-14 13:45:07 +0800 CST2015-01-14 13:45:07 +0800 CST 2015-01-14 13:45:07 +0800 CST

PostgreSQL 在没有返回行时执行默认查询

  • 772

我需要计算userId 列表的平均分数。

我有一张桌子user_place_score:

(user_id, place_id, score)

有时我没有分数((user_id,place_id)表中没有行),所以我需要从表中获取“默认”分数default_place_score:

(place_id, score)

在 PostgreSQL 中是否可以在一个查询中执行此操作?对于给定的用户列表和一个 place_id,选择他们在 中的所有分数,user_place_score如果没有找到行,则取default_place_score表中找到的分数?

基本上我想避免做这种事情:

for (Integer userId : userIds) {
  score = (query to fetch the score for this userId)
  if (score == null)
    defaultScore = (query to fetch the default score for this PlaceId)

  total = total + defaultScore
}

//return the average
return total/numberOfUser
postgresql default-value
  • 3 3 个回答
  • 3752 Views

3 个回答

  • Voted
  1. Best Answer
    ypercubeᵀᴹ
    2015-01-14T13:49:49+08:002015-01-14T13:49:49+08:00

    看起来你需要一个简单的LEFT JOIN但添加了注释,它变得有点复杂:

    SELECT 
        u.user_id,
        p.place_id,
        COALECSE(ups.score, d.score) AS score
    FROM 
        user AS u
      CROSS JOIN                                          -- the places we are
        (VALUES (1),(2),(3),...,(10)) AS p (place_id)     -- interested in
      LEFT JOIN
        user_place_score AS ups
          ON  ups.user_id = u.user_id
          AND ups.place_id = p.place_id
      LEFT JOIN 
        default_place_score AS d
          ON d.place_id = p.place_id
    WHERE                                         -- the users we are
        u.user_id IN (6, 28, 496, ...) ;          -- interested in       
    
    • 2
  2. Joishi Bodio
    2015-01-14T13:49:28+08:002015-01-14T13:49:28+08:00

    您可以使用 COALESCE() .. 它返回传递给它的列表中的第一个非空值..

    COALESCE((QUERY TO GET SCORE FOR USERID),(QUERY TO GET DEFAULT SCORE))

    编辑

    哦-您添加了“列表”要求……然后,请参阅@ypercube 的答案。

    编辑2

    如果 place_ids 存在于单独的表中,并且它们只存在于您要查询以获得分数的表中(这将被视为“良好的设计决策”),那么您应该将该表包含在您的@ypercube 的答案中使用的查询 .. COALESCE() 在这种情况下应该可以正常工作。

    SELECT 
      u.user_id,
      u.place_id,
      COALECSE(u.score, d.score) AS score
    FROM
      place_list AS pl
    LEFT JOIN
      user_place_score AS u ON pl.place_id = u.place_id
    LEFT JOIN 
      default_place_score AS d
        ON d.place_id = u.place_id ;
    

    以上取自@ypercube 的回答并进行了编辑。

    • 1
  3. T_G
    2015-01-14T13:58:33+08:002015-01-14T13:58:33+08:00

    请尝试以下查询:

    SELECT
       user_place_score.user_id,
       user_place_score.place_id,
       COALESCE(user_place_score.score, default_place_score.score) AS score
    FROM
       user_place_score
       LEFT OUTER JOIN default_place_score ON default_place_score.place_id = user_place_score.place_id
    

    COALESCE函数返回给定列表中的第一个非 NULL 值,因此如果scorefromuser_place_score不为 NULL,则函数 peaks user_place_score。score,否则它将从 中获取值default_place_score.score。

    • 1

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve