Sql多条件查询

时间:2021-07-02 22:30:07

以前我们做多条件查询,一种是排列结合,另一种是动态拼接SQL
如:我们要有两个条件,一个日期@addDate,一个是@name
第一种写法是
if (@addDate is not null) and (@name <> '')
select * from table where addDate = @addDate and name = @name
else if (@addDate is not null) and (@name ='')
select * from table where addDate = @addDate
else if(@addDate is  null) and (@name <> '')
select * from table where and name = @name
else if(@addDate is  null) and (@name = '')
select * from table

第二种就是动态组成SQL,通过exec来执行,我就不写,
昨天我想到一种办法
select * from table where (addDate = @addDate or @addDate is null) and (name = @name or @name = '')
结果一调试,成功,
一点想法,有更好方法的,请指教!~

#  re: sql 多条件查询的一种简单的方法 2004-07-16 15:18 fengzhimei
应该还可以这样写:
SELECT * FROM table WHERE ISNULL(addDate, @addDate) = @addDate and ISNULL(name, "") = @name
或者:
SELECT * FROM table WHERE addDate IN (@addDate,Null) and name IN (@name, "")
  


#  re: sql 多条件查询的一种简单的方法 2004-07-16 15:32 edobnet
你没有理解我的意思!

  


#  re: sql 多条件查询的一种简单的方法 2004-07-16 15:34 edobnet
我的意思是,@addDate  = null 不参加搜索,
@name = ''不参加搜索!
  


#  re: sql 多条件查询的一种简单的方法 2004-07-16 16:18 Goodspeed
我一般是这样来做的

SELECT * FROM table where
addDate = CASE @addDate IS NULL THEN addDate ELSE @addDate END,
name = CASE @name WHEN '' THEN name ELSE @name END
  


#  re: sql 多条件查询的一种简单的方法 2004-07-16 23:21 progame
我的方法:
Dim qm As QueryManager
Dim cv1 As ConcreteView
Dim cv2 As ConcreteView
Dim sql As String

Set qm = m_con.createQueryManager
Set cv1 = m_con.createConcreteView
Set cv2 = m_con.createConcreteView

cv1.sql = "SELECT code FROM TDalop WHERE #namefilter# "
cv1.setFilter "namefilter", "name = :name"
cv1.setParam "name", ".!)(@#&09452342'#''"""

cv2.sql = "SELECT * FROM TDalop WHERE #codefilter# and #uidfilter#"
cv2.setFilter "codefilter", "code in {codelist}"
cv2.addView cv1, "codelist"
cv2.addView cv1, "codelist"
cv2.setFilter "uidfilter", "uid = :uid"
cv2.setParam "uid", "0"

oTestResult.AddTrace cv2.getOutputSql

qm.Execute cv2
#  re: sql 多条件查询的一种简单的方法 2004-07-16 23:21 progame
凡是查询的参数为空的,直接使用 1=1 代替,这样就避免了数据库中该字段为null的情况