【问题标题】:postgresql query returning in random orderpostgresql 查询以随机顺序返回
【发布时间】:2019-02-01 05:06:29
【问题描述】:

我正在尝试创建一个 SQL 查询来查询数据库并返回有关各个机场的信息。

基本查询工作正常,但结果以随机顺序返回。

SELECT * FROM airportdata WHERE airportcode LIKE 'LHR' OR airportcode LIKE 'HKG'

以传递给查询的顺序返回它们非常重要(即来自 LHR 的机场数据是返回的第一个结果,然后是 HKG 的机场信息),但是我找不到任何 ORDER BY会工作的。

显然 FIND_IN_SET 是我应该使用的,但是我已经尝试了所有变体,但我无法让它工作!

SELECT * FROM airportdata WHERE airportcode LIKE 'LHR' OR airportcode LIKE 'HKG' ORDER BY FIND_IN_SET(airportcode,'LHR,HKG')

谁能看到我做错了什么?谢谢!

【问题讨论】:

  • 也许用 CASE 语句来构建排序键?
  • “按传入查询的顺序返回”——这是什么意思?
  • 我已经修改以澄清我的意思!干杯
  • 为什么你使用LIKE 没有任何真实的模式?为什么不只是=?
  • 那么order by airportcode desc ?

标签: javascript sql database postgresql


【解决方案1】:

使用这个查询:

SELECT * 
FROM airportdata 
WHERE airportcode LIKE 'LHR' OR airportcode LIKE 'HKG' 
ORDER BY CASE WHEN airportcode LIKE 'LHR' THEN 1 ELSE 0 END

【讨论】:

    【解决方案2】:

    我建议您使用IN。然后你可以使用一个

    SELECT *
    FROM airportdata
    WHERE airportcode IN ('LHR', 'HKG')
    ORDER BY position(airportcode in 'LHR,HKG')
    

    (这是安全的,因为机场代码应该是 3 个字符且没有逗号。)

    如果你想使用LIKE(它支持通配符),你 可以做到:

    SELECT ad.*
    FROM airportdata ad JOIN
         (VALUES ('LHR', 1),
                 ('HKG', 2)
         ) v(pattern, pos)
         ON v.airportcode LIKE pattern
    ORDER BY pos;
    

    这确实存在重复的风险,因为一个代码(理论上)可以匹配多个模式。如果这是一个真正的风险,您需要说明您喜欢哪种模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2017-12-07
      • 2023-01-16
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      相关资源
      最近更新 更多