[英]SQL Server : check not existing number into a table
我有一个已经由数千条记录填充的Clients
表,现在我需要从数字x
开始在card number
列中搜索一个不存在的数字。
示例:我想从号码 2000 开始搜索第一个可用的card number
。
不幸的是,我不能 select MAX()
因为有 9999999 的记录(这是限制)。
是否可以通过单个SELECT
进行此搜索?
如果信用卡在您的表中表示为 integer 并且您的起始编号是2000
,您可以执行以下操作:
SELECT top 1 (card_id + 1)
FROM CreditCards t
WHERE card_id IN (
SELECT card_id
FROM CreditCards
WHERE card_id LIKE '%[2][0][0][0]%'
)
AND NOT EXISTS (SELECT 1 FROM CreditCards t2 WHERE t2.card_id = t.card_id + 1)
ORDER BY card_id
示例数据(表:信用卡):
card_id |
---|
2000002 |
2000103 |
2000000 |
2000108 |
20001006 |
3000201 |
结果是:2000001
注意%[2][0][0][0]%
在这里是固定的。 您还可以引入一个参数。
这不是一个最佳解决方案,但它确实有效。
可以使用一些嵌套的SELECT
:
SELECT MIN(`card_number`) + 1 as next_available_number
FROM( SELECT (2000-1) as `card_number`
UNION
SELECT `card_number`
FROM clients
WHERE `card_number` >= 2000
) tmp
WHERE NOT EXISTS ( SELECT NULL
FROM clients
WHERE `card_number` = tmp.`card_number` + 1 )
这可以通过clients
表上的自联接来完成,您可以在其中搜索不存在cardnumber + 1
的最低cardnumber
。
如果x
是12
,则查询将是:
SELECT MIN(cardnumber) + 1
FROM clients
WHERE cardnumber + 1 NOT IN (SELECT cardnumber FROM clients)
AND cardnumber + 1 > 12
例如。 有一个数据集
INSERT INTO clients (cardnumber) VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(11),(12),(13),(14),(15),(17),(18)
这将返回 16,但不是 10。 SQL Fiddle上的示例。
我认为这与这个问题非常相似,但最低标准是新的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.