【问题标题】:SQL - Getting two rows that contain value in between themSQL - 获取两行之间包含值的行
【发布时间】:2019-01-12 09:09:28
【问题描述】:

假设我有这样一张桌子:

A | B
1 | something
2 | something2
4 | something3
8 | something4

它总是按 A 排序,但它们不一定是连续的。

现在假设我输入了数字 6,我想要返回的是:

A | B
4 | something3
8 | something4

因为 6 介于 4 和 8 之间。

如果我搜索 2,那么我只想要第二行。或者实际上第 2 和第 3 或第 1 和第 2 都可以,没关系,过滤可以轻松完成。

边缘情况也无关紧要,但假设我们有 0 我只想要第一行,假设 12 我只想要最后一行,但如果它没有返回任何内容也可以。

我有一个选择是将它们存储为范围,即:

A | B    | C
1 | 2    | something
2 | 4    | something2
4 | 8    | something3
8 | null | something4

...然后查找会很容易,但我试图避免这种情况。我真的想不出一种方法来进行这种连续的行比较。

我正在使用 PSQL,但我更好奇 SQLite 中是否也有办法做到这一点。

【问题讨论】:

    标签: sql postgresql sqlite


    【解决方案1】:

    这将为您提供大于 6 的第一行、小于 6 的第一行和第 6 行(假设输入为 6)。

    你可以玩这个。也许首先运行最后一部分,如果你没有得到任何结果,运行第一个和第二个的并集来获取周围的行。

    select *
    from t
    where A > 6
    order by A asc
    limit 1
    
    union
    
    select *
    from t
    where A < 6
    order by A desc
    limit 1
    
    union
    
    select *
    from t
    where A = 6
    

    【讨论】:

    • 谢谢,我会在可能的情况下投票(目前分数不够),但我已经想到了这个解决方案,我担心与其他可能更优雅的东西相比它很慢。
    • @user10181387 使用A 上的索引,这几乎是最有效的解决方案(没有索引,任何解决方案都不会有效)。但是使用 UNION 而不是 UNION ALL 是初学者的常见错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多