【问题标题】:Select first free number选择第一个空闲号码
【发布时间】:2015-02-17 01:19:02
【问题描述】:

你好,我有一张这样的桌子:

scheme.tabname
(
id integer not null default nextval('my_seq'::regclass),
lp integer not null
);

我希望lp 成为第一个从零开始的免费号码。每个新年都是从零开始的。

我希望它是一些 SELECT,这样我就可以将它直接放入我的代码中。
有人知道怎么做吗?

【问题讨论】:

  • 假设 nextval()nextcal 是一个错字 - 无论哪种方式都与问题正交。

标签: sql database postgresql select


【解决方案1】:

我找到了找到每年第一个免费号码的简单方法。

select case count(filter.lp) when 0 then 1
else min(filter.lp) end as lp

from (SELECT  lp + 1 as lp
FROM    table mo
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    table mi 
        WHERE   mi.lp= mo.lp + 1 and Extract(year from  mi.data_rejestracji) = Extract(year from Now())
    )
ORDER BY
    lp
LIMIT 1) filter 

【讨论】:

    【解决方案2】:
    SELECT MAX(lp) + 1 FROM shceme.tablename 
    

    将为您提供下一个 lp,但要每年重新开始,您需要一个包含年份的列。

    【讨论】:

    • 这在并发进程请求新号码时不起作用,除非您为其他读者锁定表。
    • 它不会起作用,因为如果我删除中间的一些数字怎么办?我需要再次使用它。
    猜你喜欢
    • 2019-06-25
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2014-09-14
    • 1970-01-01
    • 2015-06-10
    相关资源
    最近更新 更多