如何实现这样的复杂查询?

luolanxiang666 2004-10-02 04:45:45

查询条件有mydate(date型),myno(字符型),myscore(number型),myid(number型),myvoyage(字符型),mynews(字符型)
假设它们都属于表mytable

我想建立一个复杂的查询,目的如下:
1.若我只填了mydate和myscore,其他不填;就查询这两项条件下的记录;
2.若我只填了mydate和myscore和mynews,其他不填;就查询这三项条件下的记录;
等等...

也就是说,我只查询我所填条件的记录,而其他未填项目就不管。不知该如何写SQL语句或如何实现?
...全文
263 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zlj113 2004-10-07
  • 打赏
  • 举报
回复
没有选择的话呢就全部显示咯:
那毛毛的改下:
<%
sql="SELECT * FROM 表名 where 1=1"
if request("mydate")<>"" then
sql=sql+" and smydate='"&request("mydate")&"'"
end if
if request("myno")<>"" then
sql=sql+" and smyno='"&request("myno")&"'"
end if
if request("myscore")<>"" then
sql=sql+" and smyscore='"&request("myscore")&"'"
end if
if request("myid")<>"" then
sql=sql+" and smyid='"&request("myid")&"'"
end if
if request("myvoyage")<>"" then
sql=sql+" and smyvoyage<="&request("myvoyage")
end if
if request("mynews")<>"" then
sql=sql+" and smynews<="&request("mynews")
end if
sql=sql+" order by .. desc"
%>

就改了这里:
sql="SELECT * FROM 表名 where 1=1"

毛毛兄不要介意哦


cdown 2004-10-07
  • 打赏
  • 举报
回复
[前言]

我们经常会遇到多重查询问题,而长长的SQL语句往往让人丈二和尚摸不着头脑。特别是客户端部分填入查询条件时,如用普通方法将更是难上加难。

以下巧妙地利用"where 1=1"的恒等式(事实上很多,让它值为TRUE即可)解决此问题。


[正文概要]


'subject 信息标题

'company 发布信息的公司名称

'content 发布信息的内容

'address 公司地址

'infomation 公司简介

'note 相关说明

以上值均由FORM提交,然后通过:subject=trim(Request.Form("subject"))等得到相应的值。


<%

'这个函数很关键!---------------------------

Function sql(a,b,sqls)

if b<>"" then '如果客户端没有提交此值,则不会产生相应的SQL语句。

sqls=sqls & " and " & a & " like '%" & b & "%'"

end if

sql=sqls

End Function

'-----------------调用数据库

Set conn=Server.CreateObject("ADODB.Connection")

DBpath=Server.MapPath("/database/mydb.mdb")

Conn.Open "driver={Microsoft Access Driver (*.mdb)};pwd=;dbq=" & DBpath

Set rs=Server.CreateObject("ADODB.Recordset")

sqls="select * from mytable where 1=1 "

'以下调用上面的函数即可,可以很多个调用(理论上是任意)

sqls=sql("subject",subject,sqls)

sqls=sql("company",company,sqls)

sqls=sql("content",content,sqls)

sqls=sql("address",address,sqls)

sqls=sql("infomation",infomation,sqls)

sqls=sql("note",note,sqls)

sqls=sqls & " order by id desc"

rs.open sqls,conn,3,2

%>


[结束语]

如果没有关键的函数Function sql(a,b,sqls),我们可以想象,需要多少判断的一个接一个的语句!
sjjf 2004-10-07
  • 打赏
  • 举报
回复
一般在写代码构造sql的时候,显示的部分和 条件部分是分离开来的。而且对于条件部分,也要求尽量按照逻辑部分分割开来,以尽量保证程序的各个部分的独立性。虽然没有谁强制要求这样做,但是为了代码好维护,这不失为一种好习惯。毕竟代码不是写完就了事的,还要让后来的人读程序时不会困苦。
对于 sql="SELECT * FROM 表名 where 1=1" 的这种写法,显示部分明显和条件部分掺杂在一起,
修改代码时候如果不注意到 1=1 那么 很容易修改错。而且确定修改后分析了新的sql进行修改时候可能需要修改所有的条件(即使以前有些条件并没有变化,但你也要修改代码)。这里才那么简单几项,举举手就可以搞定了。但是如果条件扩大到 几十或者几百项呢?
当然每个人都有每个人的风格。但我相信好的编程风格能够减少犯错误的机会(不指编译的错误合格的程序员都能保证编译没有错误,这里指需求变化时修改代码导致的错误)。好了,不再讨论这个问题了,这些都是小节问题,无关痛痒,习惯而已。
lxysjl 2004-10-07
  • 打赏
  • 举报
回复
就这样呢.呵
sjjf 2004-10-06
  • 打赏
  • 举报
回复
to intergameover(塑料花):
偶私底下觉得还是把它们都写出来好一点,作为一种框架,是要适应变化的,如果某天的业务要求之间的逻辑比较符是 or 而不是 and,那么修改就麻烦了,至少,修改的面积比较大。
至于执行效率方面只要是合格的sql解释器都会进行优化的,多几个无所谓的常数表达是是不影响的,解释器会将它们去掉的。
当然解释器的优化并不一定按照你的意愿去做,要想自由,得自己写出合格的sql才行。
intergameover 2004-10-04
  • 打赏
  • 举报
回复

sql="select * from tablename where 1=1"

if xx<>"" then sql=sql & " and columxxx=xx"
if yy<>"" then sql=sql & " and columyyy=yy"

明白??
river6023 2004-10-04
  • 打赏
  • 举报
回复
ioucsdn(毛毛)这位老兄,要是没有选择查询条件的话,那这个这种写法就回抱错,怎么办?
sjjf 2004-10-03
  • 打赏
  • 举报
回复
hoho,偶曾实现过一个类似的但是比这个要复杂的查询,不过不知道是不是你想要得查询。代码不知道丢到哪儿去了,就把思想描述一下吧,(这是解决这类问题的通解)
如果你的所有的字段都是固定的,那么就按照字段间的关系构造一个全的sql吧,例如本题就可以构造如下(本体似乎所有的字段间关系较为简单,都是与的关系)
select * from mytalbe where ()and()and()and()and()and()
其中每一个()依次对应以下的字段,mydate,myno,myscore,myid,myvoyage,mynews,判断传进来的参数,在相应的()位置填入内容,(一般做法都是每一个变量逐次扫描构造这个sql在这里我将它分离开来是为了直观点说明)
加入填入了mydate和myscore 那么 where 部分将会这样子
(mydate='20040101')and()and(myscore='90')and()and()and()
下面的工作就是处理这部分字符串,处理的目的是去掉多余的空括号和逻辑比较符号,
处理的方法是类似计算后波兰表达式的方法,详细情况参见数据结构那本书哦,因为太长,和不算太简单,所以就不在这里展开来说了。(采用递归能让程序更简便些,具体实现有兴趣的再慢慢讨论吧)
为什么要采用这种方式呢?呵呵,如果你玩过有上百个输入框,并且各个输入框之间的关系错综复杂的时候,采用代码展开判断将会是一个恶梦的开始。而且极容易出错,我看到 ioucsdn(毛毛)的代码的第一个判断
if request("mydate")<>"" then
sql=sql+" and smydate='"&request("mydate")&"'"
end if
就乐了,当年我犯的第一个错误也类似这样。呵呵,如果只传入 mydate的时候,那么这条sql将会报错,因为多了一个and ,如果多几个逻辑比较符号和多几个字段,呵呵代码量将成几何级数增长。当然错误也会增长的。
当然在这里也有一个比较简便的实现方法,只是针对本题的,
(1=1)and(1=1)and(1=1)and(1=1)and()and(1=1)
对where 部分如果()对应的字段没有传入值的话 就填充个1=1代替吧,实现就用毛毛的代码修改下吧.
if request("mydate")<>"" then
sql=sql+" smydate='"&request("mydate")&"'"
else
sql=sql+"(1=1)"
end if
if request("myno")<>"" then
sql=sql+" and smyno='"&request("myno")&"'"
else
sql=sql+" and ( 1=1 )"
end if
以后项和第二项一样.
第二种方法是的sql是冗余一点,但是没有关系,反正你的sql也没有多少东西,呵呵,如果你的sql
手工写时都差不多是7k长度的时候,你就会发现第一种方法是多么的可爱了。
luolanxiang666 2004-10-03
  • 打赏
  • 举报
回复
可有时候我不想让日期进行查询呀!!!
liuyu202 2004-10-03
  • 打赏
  • 举报
回复
不能让日期为空!!!
luolanxiang666 2004-10-03
  • 打赏
  • 举报
回复
每人知道吗,解决了好送分呀?
luolanxiang666 2004-10-03
  • 打赏
  • 举报
回复
可是当我的查询条件中日期为空时,就会出现下面的错误,不知为何??


Microsoft VBScript 编译器错误 错误 '800a03f6'

缺少 'End'

/iisHelp/common/500-100.asp,行242

Microsoft OLE DB Provider for Oracle 错误 '80020009'

ORA-01841: (full) year must be between -4713 and +9999, and not be 0
/xiamenair/guanli1/search/search_result_first.asp,行0

hxnet 2004-10-02
  • 打赏
  • 举报
回复
ioucsdn(毛毛) 的解答没问题

if request("myno")<>"" then
sql=sql+" and smyno like '%"&request("myno")&"%'"

字符串可以使用like和%
serverme 2004-10-02
  • 打赏
  • 举报
回复
用存储过程把,很简单的,给你一个以前我写过的参考:
CREATE PROCEDURE dtalyjd_search (@jduser_type varchar(50),@jduser_star varchar(50),@jduser_name varchar(50)) AS
DECLARE @str varchar(4000)
if @jduser_name=''
begin
set @str='select * from dtalyjduser where jduser_type='''+@jduser_type+''' and jduser_star='''+@jduser_star+''''
select @str sql
return
end
else
begin
set @str='select * from dtalyjduser where jduser_type='''+@jduser_type+''' and jduser_star='''+@jduser_star+''' and jduser_name like ''%'+@jduser_name+'%'''
select @str sql
return
end
GO
ioucsdn 2004-10-02
  • 打赏
  • 举报
回复
<%
sql="SELECT * FROM 表名 where ..."
if request("mydate")<>"" then
sql=sql+" and smydate='"&request("mydate")&"'"
end if
if request("myno")<>"" then
sql=sql+" and smyno='"&request("myno")&"'"
end if
if request("myscore")<>"" then
sql=sql+" and smyscore='"&request("myscore")&"'"
end if
if request("myid")<>"" then
sql=sql+" and smyid='"&request("myid")&"'"
end if
if request("myvoyage")<>"" then
sql=sql+" and smyvoyage<="&request("myvoyage")
end if
if request("mynews")<>"" then
sql=sql+" and smynews<="&request("mynews")
end if
sql=sql+" order by .. desc"
%>
dwowbaaa 2004-10-02
  • 打赏
  • 举报
回复
不解 把form法上来看看

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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