求一条简单的SQL查询语句(50分)

  • 主题发起人 主题发起人 々飞翔鸟々
  • 开始时间 开始时间

々飞翔鸟々

Unregistered / Unconfirmed
GUEST, unregistred user!
表A结构如下:<br>编号 &nbsp; 终端号<br>id &nbsp; &nbsp; PosNo<br>1 &nbsp; &nbsp; &nbsp;1,2,3<br>2 &nbsp; &nbsp; &nbsp;4,5,6,7,8<br>3 &nbsp; &nbsp; &nbsp;9,10,11<br>4 &nbsp; &nbsp; &nbsp;12<br>5 &nbsp; &nbsp; &nbsp;13,14,15<br>现在的问题是:要求按终端号进行查询,比如输入:4,7 则结果为:<br>id &nbsp; &nbsp; PosNo<br>2 &nbsp; &nbsp; &nbsp;4,5,6,7,8<br>请问如何实现,谢谢
 
好像很麻烦,你查查正则表达式是否支持下面的语法:<br>Select * From A Where (4,7) in PosNo
 
这还简单? 确实简单 不过效率很低,你的数据库设计有问题 <br>就说你那个posNo吧 根本不具备内容的一致性,按照你现有的表结构 你应该把它改成<br>id &nbsp; &nbsp; PosNo<br>1 &nbsp; &nbsp; &nbsp;,1,2,3<br>2 &nbsp; &nbsp; &nbsp;,4,5,6,7,8<br>查询结果 可以使用 like '%,4%' and like '%,7' <br>&nbsp;但是效率还是很低 改改数据库结构吧 做成1对多 就可以了 效率很高的
 
楼上的, 总不能叫别人修改数据库设计吧,<br>SQL语句实现不容易, 可以先把数据查询出来然后再遍历数据集处理。
 
我也认为数据库的设计有问题,还有就是wyb_506的方法好像不一定可靠,当然也不完全是语句的问题,如:<br>id &nbsp; &nbsp; PosNo<br>1 &nbsp; &nbsp; &nbsp;,1,2,3<br>2 &nbsp; &nbsp; &nbsp;,4,5,6,7,8<br>3 &nbsp; &nbsp; &nbsp;,4,7<br>这时就会查出2条记录,不知是否会有这种情况?
 
drop table #t<br>declare @id varchar(30), @posno varchar(30)<br>create table #t<br>(<br> id varchar(30),<br>&nbsp; &nbsp; posno varchar(30)<br>)<br><br>DECLARE contact_cursor CURSOR FOR<br>SELECT id, posno FROM a_a<br><br>OPEN contact_cursor<br><br>-- Perform the first fetch.<br>FETCH NEXT FROM contact_cursor into @id,@posno<br><br>-- Check @@FETCH_STATUS to see if there are any more rows to fetch.<br>WHILE @@FETCH_STATUS = 0<br>BEGIN<br>&nbsp; &nbsp;if @posno=--处理字符串函数 <br>&nbsp; &nbsp; &nbsp; insert #t (id,posno) values(@id,@posno)<br>&nbsp; &nbsp;FETCH NEXT FROM contact_cursor into @id,@posno<br>END<br><br>CLOSE contact_cursor<br>DEALLOCATE contact_cursor<br><br>select * from #t
 
从楼主的说明看<br>第一种情况,POSNO里面的数据不重复,则使用Select * From A Where (4,7) in PosNo<br>第二种情况,如果POSNO里面的数据有重复,则用like应该也够了
 
我晕 怎么还在讨论这个问题啊 <br>来自:szhcracker, 时间:2008-9-25 11:39:12, ID:3923420 说得 查询出现2条记录<br>按照楼主的逻辑 就是得出现两条啊<br>来自:plalzh, 时间:2008-9-25 21:59:38, ID:3923491 <br>从楼主的说明看<br>第一种情况,POSNO里面的数据不重复,则使用Select * From A Where (4,7) in PosNo<br>---这个更不可取 除非4跟7连着 &nbsp;那要是4跟7离1个字符 或者两个字符都不一样<br>同时 like 效率最低了 况且两个like 效率。。。<br>不改数据库 我觉得就得使用我说的办法 如果有更好的办法 欢迎拿来共享
 
貌似在Oracle中,Select * From A Where (4,7) in PosNo 是不支持这种语法的。不知SQL Server是否支持。
 
貌似在Oracle中,Select * From A Where (4,7) in PosNo 是不支持这种语法的。不知SQL Server是否支持。SQL 不支持;<br><br>lx8598 用游标的话 效率很低 <br><br>POSNO里面的数据不重复<br><br>&nbsp; PosNo := Trim(RzEdit3.Text);//界面上的终端号查询条件输入框<br>&nbsp; if PosNo&lt;&gt;'' then<br>&nbsp; begin<br>&nbsp; &nbsp; i := pos(',',PosNo);<br>&nbsp; &nbsp; if i = 0 then<br>&nbsp; &nbsp; &nbsp; &nbsp; strSQL := strSQL + 'and PosNolike ''%,'+PosNo+''' or PosNo like ''%,'+PosNo+',%'' or PosNolike '''+PosNo+',%'' '<br>&nbsp; &nbsp; else begin<br>&nbsp; &nbsp; &nbsp; &nbsp; str := TStringList.Create;<br>&nbsp; &nbsp; &nbsp; &nbsp; str.CommaText := PosNo;<br>&nbsp; &nbsp; &nbsp; &nbsp; for i:=0 to str.Count-1 do<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if i=0 then<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strSQL := strSQL + 'and PosNolike ''%,'+str+''' or PosNo like ''%,'+str+',%'' or PosNo like '''+str+',%'' '<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; strSQL := strSQL + 'or PosNo like ''%,'+str+''' or PosNo like ''%,'+str+',%'' or PosNo like '''+str+',%'' ';<br>&nbsp; &nbsp; end;<br>&nbsp; end;
 
多人接受答案了。
 
Select * From A Where (PosNo like '%4%') and (PosNo like '%7%)
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部