请教一个sql语句

yadongfile 2005-06-04 10:39:26
table a
==================================================
CREATE TABLE [dbo].[Accounts_User] (
[UserName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[PassWord] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Register] [datetime] NOT NULL ,
[LastLogin] [datetime] NOT NULL
) ON [PRIMARY]
GO
-----------------------------
其中用户名为手机号或者小灵通号
table b
====================================================================
CREATE TABLE [dbo].[Henan_xlt] (
[City] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[ZipCode] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[City_Code] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
--------------------------------
示例数据
City ZipCode City_Code
郑州市 450000 0371
新乡市 453000 0373
焦作市 454100 0391
安阳市 455000 0372
鹤壁市 456600 0392
濮阳市 457000 0393
许昌市 461000 0374
缧河市 462000 0395
-----------------------------------
table c
============================
CREATE TABLE [dbo].[Phone] (
[Province] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[City] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Start_Num] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[End_Num] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Type] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Owner] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
-----------------------------------------
示例数据

Province City Start_Num End_Num Type Owner
北京 北京 13000100000 13000119999 3 北京联通
天津 天津 13000120000 13000139999 3 天津联通
山东 淄博 13000150000 13000159999 3 山东联通
山东 烟台 13000160000 13000169999 3 山东联通
山东 济南 13000170000 13000179999 3 山东联通
上海 上海 13000210000 13000219999 3 上海联通
江苏 南京 13000250000 13000259999 3 江苏联通
山东 烟台 13000270000 13000279999 3 山东联通
江苏 无锡 13000330000 13000339999 3 江苏联通
浙江 杭州 13000360000 13000369999 3 浙江联通
-----------------------------------------------------

要求:
在table a 中加入一列显示地域信息。如果用户名是小灵通号码则从table b 中找出地域信息
如果是手机号码 则从table c 中找出地域信息
...全文
129 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yadongfile 2005-06-06
  • 打赏
  • 举报
回复
select UserName,password,City=(Case When left(UserName,1)='0'
then
(select City from Henan_xlt where City_Code=left(a.UserName,4))
else
(select City from Phone where UserName between Start_Num and End_Num)
end
)
from Accounts_User a

table a 中现在有800多条数据,查询时间已经在10秒以上了
现在我对原来的表建立了索引如下:
Henan_xlt 设置 City_Code 为主键
phone    设置  Start_Num 和 End_Num  为唯一索引  看哪位有比较好的优化建议 ?
yjdn 2005-06-04
  • 打赏
  • 举报
回复
另:楼主建表的时候,为什么把长度都设为8000?故意的?
如果不是,一个表中,所有列的长度加起来最大才是8000
yjdn 2005-06-04
  • 打赏
  • 举报
回复
select UserName,password,City=(Case When left(UserName,1)='0'
then
(select City from Henan_xlt where City_Code=left(a.UserName,4))
else
(select City from Phone where UserName between Start_Num and End_Num)
end
)
from Accounts_User a

--结果
03716167433 adfasdf 郑州市
03735565550 dasfsa 新乡市
13000210001 dfsdf 上海
13000250022 asdfsd 南京
yadongfile 2005-06-04
  • 打赏
  • 举报
回复
on (a.username bewteen c.start_num and c.end_num) and a.username like '13%'

不能用bewteen 吧 ?
yjdn 2005-06-04
  • 打赏
  • 举报
回复
select UserName,password,City=(Case When len(UserName)=11
then
(select City from b where City_Code=left(a.UserName,4))
else
(select City from c where UserName between Start_Num and End_Num)
end
)
from a


--小灵通位数是11位吗?
上面没有测试
xluzhong 2005-06-04
  • 打赏
  • 举报
回复
select a.*,city=case when a.username like '13%' then c.City
else b.City
end
from a
left join c
on (a.username bewteen c.start_num and c.end_num) and a.username like '13%'
left join b
on left(a.username,4)=b.City_Code and a.username not like '13%'
yadongfile 2005-06-04
  • 打赏
  • 举报
回复
不是这个意思,在这里存储过程不能有任何参数,这个存储过程就是选出table a 里的全部数据 然后加上一列地域信息 地域信息是根据username 从table b 或者 table c 里寻找

table b 中
只用关注City_Code 这一列
因为 小灵通号码是 037139714122 ,03756525147,这样的形式
也就是说 如果用户名是以0开头的则截取前4位和 city_code 这一列做比较

最后的结果应该为

username password city
03716167433 adfasdf 郑州
03755565550 dasfsa 平顶山
13939039191 dfsdf 河南郑州
13026584258 asdfsd 河北石家庄
…………… ………… …………
…………… ……………… ………………

yjdn 2005-06-04
  • 打赏
  • 举报
回复
没用过小灵通,不知道b表的具体意思,
在这里看来,应该用模糊查询吧查询@UserName在B表中相似的部份,
yjdn 2005-06-04
  • 打赏
  • 举报
回复
create proc proc_test
@UserName varchar(50)
as
if len(@UserName)=6 --小灵通几位号这里就输入几位
begin
--小灵能查询
end
else
begin
select Province,Owner from c where Start_Num<@UserName and End_Num =<@UserName
end
yadongfile 2005-06-04
  • 打赏
  • 举报
回复
谢谢了 导入的 没有改 呵呵

34,590

社区成员

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

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