You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在PostgreSQL中,如何获取布尔条件匹配行的前后行及该行?

解决方案:查询目标行及其前后行

要实现查询is_selected=true的行,以及它们的前一行和后一行,可以利用窗口函数或行号关联的方式,以下是两种通用方案(适用于支持窗口函数的数据库,如PostgreSQL、MySQL 8.0+、SQL Server等):

方案一:基于行号关联

先为每行按字母顺序分配行号,再筛选出目标行的行号及其前后行号对应的记录:

WITH numbered_letters AS (
    SELECT 
        alphabet_letter, 
        is_selected,
        ROW_NUMBER() OVER (ORDER BY alphabet_letter) AS rn
    FROM letters
),
selected_rns AS (
    SELECT rn FROM numbered_letters WHERE is_selected = true
)
SELECT 
    nl.alphabet_letter, 
    nl.is_selected
FROM numbered_letters nl
JOIN selected_rns sr ON nl.rn IN (sr.rn - 1, sr.rn, sr.rn + 1)
ORDER BY nl.rn;

方案二:利用窗口函数判断前后行

通过LAG和LEAD函数获取当前行的前一行、后一行的is_selected值,直接筛选符合条件的行:

SELECT
    alphabet_letter,
    is_selected
FROM (
    SELECT
        alphabet_letter,
        is_selected,
        LAG(is_selected) OVER (ORDER BY alphabet_letter) AS prev_selected,
        LEAD(is_selected) OVER (ORDER BY alphabet_letter) AS next_selected
    FROM letters
) sub_query
WHERE is_selected = true 
   OR prev_selected = true 
   OR next_selected = true
ORDER BY alphabet_letter;

结果验证

执行上述任意语句后,将得到符合预期的结果:

alphabet_letter  | is_selected
-----------------+-------------
 C               | f
 D               | t
 E               | f
 H               | f
 I               | t
 J               | f

内容的提问来源于stack exchange,提问作者justsomeguy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 19:40:18