怎样得到数据库里某字段里没出现过、而且还是最小的数字呢?

大健 2002-08-21 11:59:21
新用户注册,让其输入一个六位的唯一的数字作为其ID号,系统要检测该ID是否已有人使用了。若有,则推荐用户另一个还没有使用过的而且是最小的数字ID(例如000001、000002、000006已有人使用。当新用户输入000006时系统检测到该数字ID已有人使用了,就把000003推荐给用户)。
在数据库里,这表名叫Member,这ID的字段名是Phone_ID(六位的char)。请问我该怎样做,才能得到最没出现过的、最小的数字呢?
(我的想法是用一个循环从000001开始搜索,直到找到没出现的数字,但这样做好像很愚蠢,有没有更好的方法呢?)
...全文
55 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqqdong 2002-08-21
  • 打赏
  • 举报
回复
建立一个为未用的ID资源表管理就可以
icevi 2002-08-21
  • 打赏
  • 举报
回复
select replicate('0',6-len(cast(cast(min(t0.phone_id) as int)+1 as varchar)))+
cast( cast(min(t0.phone_id) as int)+1 as varchar)
from member t0
where not exists
(select 1
from member t1
where cast(t1.phone_id as int)=cast(t0.phone_id as int)+1
)
大健 2002-08-21
  • 打赏
  • 举报
回复
即是不是说,还是逃避不了逐个逐个的判断这ID是否存在?
天啊~~~~
N_chow 2002-08-21
  • 打赏
  • 举报
回复
好像要loop判斷max(ID)+1是否在已在表中才行啊 :(
大健 2002-08-21
  • 打赏
  • 举报
回复
大侠,不要走,救救我呀~~~~
N_chow 2002-08-21
  • 打赏
  • 举报
回复
Sorry有錯。
N_chow 2002-08-21
  • 打赏
  • 举报
回复
IF EXISTS(SELECT 1 FROM Member WHERE ID='000006' ) --已存在這個ID

SELECT RIGHT(CAST(POWER(10,6)+CAST(MAX(ID) AS INT)+1 AS VARCHAR),6)
FROM @csdn
WHERE ID<>'000006'
大健 2002-08-21
  • 打赏
  • 举报
回复
问题都解决了,原来是漏了MyDataReader.Read()
(这问题好像放错地方了)
分数一会儿送上。
大健 2002-08-21
  • 打赏
  • 举报
回复
救命呀,又出现了问题:
strSQL = " select min(right('00000'+cast(cast(phone_id as int)+1 as varchar(6)),6)) as AAA from Member a "
strSQL &= "where not exists ("
strSQL &= " select * from Member"
strSQL &= " where phone_id=right('00000'+cast(cast(a.phone_id as int)+1 as varchar(6)),6)"
strSQL &= " )"
SQLCmd.CommandText = strSQL
SQLCmd.Connection = MyConn
MyDataReader = SQLCmd.ExecuteReader()
theValue=MyDataReader.Item("AA")

出错信息如下:
System.InvalidOperationException: 在没有任何数据时进行无效的读取尝试。 at System.Data.SqlClient.SqlDataReader.PrepareRecord(Int32 i) at System.Data.SqlClient.SqlDataReader.GetValue(Int32 i) at System.Data.SqlClient.SqlDataReader.get_Item(String name) at WebTest.CheckForm.CheckPhoneId(String APhoneId) in C:\Inetpub\wwwroot\WebTest\CheckForm.aspx.vb:line 106

把那SQL语句放到SQL查询分析器里运行,返回“000005”的。
大健 2002-08-21
  • 打赏
  • 举报
回复
哈哈...终于明了。看来程序员跟和尚一样,也是要讲求顿悟的。谢谢大家的帮助,分数一会儿送上。
(这几个小时一直就是研究这个问题,苦呀!!)
gzhughie 2002-08-21
  • 打赏
  • 举报
回复
SELECT CASE WHEN MIN(CAST(Phone_ID AS INT))>1 THEN '000001'
ELSE RIGHT('00000'+RTRIM(LTRIM(CAST(MIN(CAST(Phone_ID AS INT)+1) AS VARCHAR(6)))),6)
END AS Phone_ID
FROM Member A
WHERE CAST(Phone_ID AS INT)+1 NOT IN (SELECT CAST(Phone_ID AS INT) AS Phone_ID FROM Member)
大健 2002-08-21
  • 打赏
  • 举报
回复
原来SQL SERVER里能查到replicate、cast等这样的函数,太好了。
to Yang_(扬帆破浪):用你的代码得到了预期的结果,谢谢。知其然,我更想知其所以为然,你能给我解释一下吗,我不明为什么这要写就可以得到这个结果哟~~~ (为什么要加上1?)
to Tongls(JackieTong):我也没办法,这是老板的要求。
Tongls 2002-08-21
  • 打赏
  • 举报
回复
在一般程序设计中,不是想你这样设计的,一般是设计流水号! 如果是流水号就只要找到最大值以后,再加一就可以啦!
N_chow 2002-08-21
  • 打赏
  • 举报
回复
哈,不錯。學了一把。
Yang_ 2002-08-21
  • 打赏
  • 举报
回复
select min(right('00000'+cast(cast(id as int)+1 as varchar(6)),6)) from Member a
where not exists (
select * from Member
where id=right('00000'+cast(cast(a.id as int)+1 as varchar(6)),6)
)

大健 2002-08-21
  • 打赏
  • 举报
回复
TO icevi(按钮工厂):你这串代码应该写在什么地方?能直接放到SqlCommand.CommandText里再用SqlDataReader把所要的值读出来吗?能给我作详细的解释吗,小弟刚出来工作,功力浅看不懂哟~~~
(replicate和cast是哪里的函数,是SQL SERVER里的还是VS.net里的?作用是什么和怎样使用?主要就是这两个函数看不明)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧