gpt4 book ai didi

postgresql - Postgres 9.5.2 在开发与生产中的排序不同

转载 作者:行者123 更新时间:2023-11-29 12:19:05 25 4
gpt4 key购买 nike

更新

在我使用 postgresql 的 rails 应用程序中,我编写了一个 Active Record 查询来查找一组志愿者记录,然后按 first_name 对它们进行排序。 ,然后 last_name ,然后 email .此外,first_namelast_name可能是 null (要么都是 null 要么都不是 null )。 Active Record 生成的 sql 如下所示:

SELECT DISTINCT LOWER(COALESCE("volunteers"."first_name", "volunteers"."email")), LOWER(COALESCE("volunteers"."last_name", "volunteers"."email")), LOWER("volunteers"."email"), "volunteers".* 
FROM "volunteers"
INNER JOIN "volunteer_list_connectors" ON "volunteer_list_connectors"."volunteer_id" = "volunteers"."id"
INNER JOIN "volunteer_lists" ON "volunteer_lists"."id" = "volunteer_list_connectors"."volunteer_list_id"
WHERE ((volunteer_lists.organizer_id = 1 AND organizer_type = 'Organization') OR (volunteer_lists.organizer_id IN (1) AND organizer_type = 'Collaborative'))
ORDER BY
LOWER(COALESCE("volunteers"."first_name", "volunteers"."email")) ASC,
LOWER(COALESCE("volunteers"."last_name", "volunteers"."email")) ASC,
LOWER("volunteers"."email") ASC

使用 Postgres 的 psql工具,我将该 sql 复制并粘贴到我的开发机器和服务器上的 Postgres 中。在我的开发机器(Mac)上,该 sql 对以下列表进行了排序:
  • 志愿者 [first_name:'Alex',last_name:'Diego',电子邮件:
    'a.diego@person.com']
  • 志愿者 [first_name: null ,姓氏:null , 电子邮件:
    'cxxr@person.com']
  • 志愿者 [first_name: 'Josh', last_name: 'Broger', 电子邮件:
    'broger@person.com']
  • 志愿者 [first_name: 'Josh', last_name: 'Broger', 电子邮件:
    'jcool@person.com']
  • 志愿者 [first_name: 'Josh', last_name: 'Kenton', 电子邮件:
    'aj@person.com']

  • 在我的生产环境(Ubuntu)中,Postgres 通过对列表进行排序来响应相同的代码,如下所示:
  • 志愿者 [first_name: null ,姓氏:null , 电子邮件:
    'cxxr@person.com']
  • 志愿者 [first_name:'Alex',last_name:'Diego',电子邮件:
    'a.diego@person.com']
  • 志愿者 [first_name: 'Josh', last_name: 'Broger', 电子邮件:
    'broger@person.com']
  • 志愿者 [first_name: 'Josh', last_name: 'Broger', 电子邮件:
    'jcool@person.com']
  • 志愿者 [first_name: 'Josh', last_name: 'Kenton', 电子邮件:
    'aj@person.com']

  • 不同之处在于只有一个电子邮件地址的志愿者总是排在其他志愿者之前。生产环境和开发环境都运行 PostgreSQL 9.5.2。两者都运行 Rails 4.2.6。

    我一直无法弄清楚为什么我的应用程序在开发和生产中表现不同。

    有人有想法么?非常感谢任何进一步探索的帮助/领域!

    更新 2

    根据评论中的要求,这是我的开发机器和生产机器的 psql 输出。我稍微更改了查询以使图片可读。在此查询中,我添加了 LIMIT 10我只要求 first_name , last_name , 和 email而不是整个记录。你必须相信我的话,两个数据库都包括 volunteers只有 email 的记录地址,以及带有 first_name 的记录, last_name , 和 email .如果我的生产数据库按预期工作,它的输出将类似于第一张图片中的输出。

    此屏幕截图显示 psql我的开发机器的输出(好):

    This screen grab shows <code>psql</code> output from my dev machine (good)

    此屏幕截图显示 psql我的生产机器的输出(坏)。因为这是输出中的真实用户数据,所以我模糊了电子邮件地址。但重要的一点是带有 first_name = null 的记录。和 last_name = null即使电子邮件地址的第一个字母是“Z”,也总是先排序:

    This screen grab shows <code>psql</code> output from my production machine (bad)

    我可能是错的,但我认为生产机器输出应该在每一列中显示电子邮件地址, COALESCE()正常运作

    回答

    感谢@ClémentPrévost(以及@muistooshort 向我提出了正确的问题!)我能够找到答案:我认为没有正确排序的生产记录实际上在 first_name 中有空白字符串。和 last_name而不是 null值(和 COALESCE() 只过滤掉 null 值,而不是空白字符串)。我用 NULLIF("volunteers"."first_name", \'\') 更新了我的代码一切都开始正确分类!
    SELECT DISTINCT LOWER(COALESCE(NULLIF("volunteers"."first_name", ''), "volunteers"."email")), LOWER(COALESCE(NULLIF("volunteers"."last_name", ''), "volunteers"."email")), LOWER("volunteers"."email"), "volunteers".* 
    FROM "volunteers"
    INNER JOIN "volunteer_list_connectors" ON "volunteer_list_connectors"."volunteer_id" = "volunteers"."id"
    INNER JOIN "volunteer_lists" ON "volunteer_lists"."id" = "volunteer_list_connectors"."volunteer_list_id"
    WHERE ((volunteer_lists.organizer_id = 1 AND organizer_type = 'Organization') OR (volunteer_lists.organizer_id IN (1) AND organizer_type = 'Collaborative'))
    ORDER BY
    LOWER(COALESCE(NULLIF("volunteers"."first_name", ''), "volunteers"."email")) ASC,
    LOWER(COALESCE(NULLIF("volunteers"."last_name", ''), "volunteers"."email")) ASC,
    LOWER("volunteers"."email") ASC

    最佳答案

    那些真的是空值还是只是空字符串?

    您可以使用 \pset null ¤来区分两者。

    PS:问题评论中的精彩讨论!

    关于postgresql - Postgres 9.5.2 在开发与生产中的排序不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36816378/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com