关于sql多条件查询[转]
2007-11-17 09:54
453 查看
/*以后我们做多条件查询,一种是排列结合,另一种是动态拼接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 = '')
declare @sql char(1000)
set @sql = 'select * from tablename where 1=1'
if condition1
set @sql=@sql+ 'and column1=?'
if condition2
set @sql=@sql+ 'and column2=?'
..
Exec(@sql)
--正确的书写格式应该是这样的:
ALTER PROCEDURE [dbo].[ap_intranetDHCPGetByIPAddressNameMacSel]
(
@IPAddress nvarchar (255) ,
@Name nvarchar (255) ,
@Mac nvarchar (255)
)
AS
SELECT
dhcpID,
[IPAddress],
[Name],
[Description],
[Mac],
[Switch],
[Port],
[AdminSvc],
[InternalSvc],
[ExternalSvc]
FROM
intranetdhcp
WHERE
(
([IPAddress] like '%'+ @IPAddress + '%') or
(@IPAddress='')
) and
([Name]like '%'+@Name+'%' or @Name='') and
([Mac] like '%'+@Mac+'%' or @Mac='')
order by
[IPAddress]
--对了 用了null之后,你的where条件可以改写为这样:
WHERE
IsNull(@IPAddress, IPAddress) = IPAddress And
IsNull(@Name, Name) = Name and
IsNull(@Mac, Mac) = Mac
/*
用''的确是方便,
但''与null的意义是不同的:
null表示没有输入,''表示输入了值为''
所以用null更容易理解,并且除字符型字段外其它为空的字段必须转换
null应该在调用时用DBNull.Value传给参数,而不是在sp中加:
if @IPAddress = '' set @IPAddress = null
另外Isnull()还是有漏洞的,也无法达到模糊查询。
但IPAddress,Name, Mac之类感觉上并不需要用到模糊查询
*/
如:我们要有两个条件,一个日期@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 = '')
declare @sql char(1000)
set @sql = 'select * from tablename where 1=1'
if condition1
set @sql=@sql+ 'and column1=?'
if condition2
set @sql=@sql+ 'and column2=?'
..
Exec(@sql)
--正确的书写格式应该是这样的:
ALTER PROCEDURE [dbo].[ap_intranetDHCPGetByIPAddressNameMacSel]
(
@IPAddress nvarchar (255) ,
@Name nvarchar (255) ,
@Mac nvarchar (255)
)
AS
SELECT
dhcpID,
[IPAddress],
[Name],
[Description],
[Mac],
[Switch],
[Port],
[AdminSvc],
[InternalSvc],
[ExternalSvc]
FROM
intranetdhcp
WHERE
(
([IPAddress] like '%'+ @IPAddress + '%') or
(@IPAddress='')
) and
([Name]like '%'+@Name+'%' or @Name='') and
([Mac] like '%'+@Mac+'%' or @Mac='')
order by
[IPAddress]
--对了 用了null之后,你的where条件可以改写为这样:
WHERE
IsNull(@IPAddress, IPAddress) = IPAddress And
IsNull(@Name, Name) = Name and
IsNull(@Mac, Mac) = Mac
/*
用''的确是方便,
但''与null的意义是不同的:
null表示没有输入,''表示输入了值为''
所以用null更容易理解,并且除字符型字段外其它为空的字段必须转换
null应该在调用时用DBNull.Value传给参数,而不是在sp中加:
if @IPAddress = '' set @IPAddress = null
另外Isnull()还是有漏洞的,也无法达到模糊查询。
但IPAddress,Name, Mac之类感觉上并不需要用到模糊查询
*/
相关文章推荐
- 关于java多条件查询SQL语句拼接的小技巧
- 关于sql查询字符char类型数据的条件使用
- 关于linq语句与sql语句查询条件==null处理的奇妙现象
- 关于 java 按时间条件查询 sql语句
- 关于SQL连接 加条件查询的LINQ表达式写法
- 第一个文章,今天比较兴奋啊! 给大家一个关于SQL复合查询的文章(动态生成多个where条件)
- 关于日期条件查询的sql 代码
- 关于多重条件的搜索查询(sql server+c#)
- 关于sql多条件查询,但又不确定值的个数的方法。
- 请教一下各位大侠,关于sql语句中使用case替换where条件的查询出现空行的原因
- 关于一条sql条件查询+排序 如何加索引最合适
- 关于sql条件语句where id in (@参数)执行报错问题(转换成数据类型 int 时失败)(
- SQL中以count及sum为条件的查询
- SQL练习1关于插入删除,修改,单表查询
- SQL多条件查询
- 关于从sql*plus中往数据库插入数据却查询不到的原因
- 使用Sql按日期条件查询
- [导入]利用Attribute特性简化多查询条件拼接sql语句的麻烦
- SQL多条件查询Sql语句(动易标签常用)
- 【Java EE (Struts2 + Spring + Hibernate)开发】 :Hibernate(二)之【HQL查询|条件查询|SQL查询】