sql多值查询

zychenzy 2005-07-21 12:51:50
我的查询有4个条件,每个条件又是可有可无的(每次查询可以全选,也可以不选条件),我以前是用IF then 来写的,但是现在条件多了,过多的IF语句会引响查询速度,请问大侠们怎么做,
最好写语句看一下。
...全文
234 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
qgqchile 2005-07-22
WangZWang(阿来) 的方法 很不错啊,我就是这样做多样查询的,给你个现成的STORE PROCEDURE做参考
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = N'Pos_ListarPos'
AND type = 'P')
DROP PROCEDURE Pos_ListarPos
GO

CREATE PROCEDURE Pos_ListarPos
@StrXMLDatos VARCHAR(8000) AS

DECLARE @idoc INT


DECLARE @pais NUMERIC
DECLARE @ciudad Numeric


DECLARE @sexo NUMERIC
DECLARE @estadoCivil NUMERIC

DECLARE @licencia NUMERIC
DECLARE @titulo numeric


DECLARE @contador numeric

DECLARE @edad numeric


DECLARE @strSelect VARCHAR(1000)

DECLARE @strFrom VARCHAR(1000)

DECLARE @strWhere VARCHAR(4500)

DECLARE @strOrder VARCHAR(500)

DECLARE @strInsert VARCHAR(1000)

DECLARE @strSQL VARCHAR(8000)

BEGIN TRANSACTION TX

EXEC sp_xml_preparedocument @idoc OUTPUT, @StrXMLDatos


-- Lee documento XML de entrada
SELECT

@pais=pais,
@ciudad=ciudad,


@sexo=sexo,
@estadoCivil=estadoCivil,

@licencia=licencia,
@titulo=titulo,
@edad=edad


FROM OPENXML (@idoc, '/parametros',2)
WITH (

pais NUMERIC,
ciudad numeric,

sexo NUMERIC,
estadoCivil NUMERIC,
nacimiento VARCHAR(10),

licencia NUMERIC,
titulo numeric,
edad numeric
)

EXEC sp_xml_removedocument @idoc



BEGIN



SET @strSelect = ''
SET @strFrom = ''

SET @strSQL = ''
SET @strSelect=''

SET @strWhere=' where id_pos<> '''+ ''''

SET @strSelect ='SELECT a.* '
SET @strFrom = ' from PosI_Ficha a '

if @pais<>0
set @strFrom=@strFrom+' ,admin.dbo.detCodSys b '
set @strWhere =@strWhere+' and pais= '+ cast(@pais as varchar)
+' and '+ cast(@pais as varchar) + ' =b.idCodDet '

--SET @strSQL = @strSelect + @strFrom + @strWhere
--print @strSQL
--print @ciudad

if @ciudad<>0
set @strSelect=@strSelect+' ,c.descCodDet as ciudad '

if @ciudad<>0
set @strFrom=@strFrom+' ,admin.dbo.detCodSys c '

if @ciudad<>0
set @strWhere=@strWhere+' and ciudad= '+cast(@ciudad as varchar)
+' and '+ cast(@ciudad as varchar) + ' =c.idCodDet '


if @sexo<>0
set @strSelect=@strSelect+' ,d.descCodDet as sexo '
set @strFrom=@strFrom+' ,admin.dbo.detCodSys d '
set @strWhere=@strWhere+' and sexo= '+cast(@sexo as varchar)
+' and '+ cast(@sexo as varchar) + ' =d.idCodDet '



if @estadoCivil<>0
set @strSelect=@strSelect+' ,e.descCodDet as estadoCivil '
set @strFrom=@strFrom+' ,admin.dbo.detCodSys e '
set @strWhere=@strWhere+' and estadoCivil= '+cast(@estadoCivil as varchar)
+' and '+ cast(@estadoCivil as varchar) + ' =e.idCodDet '



if @licencia<>0
set @strSelect=@strSelect+' ,g.descCodDet as licencia '
set @strFrom=@strFrom+' ,admin.dbo.detCodSys g '
set @strWhere=@strWhere+' and licencia = '+ cast(@licencia as varchar) +' and '+
cast(@licencia as varchar)+ ' = g.idCodDet'



if @titulo<>0
set @strWhere=@strWhere+' and titulo= '+ cast(@titulo as varchar)

if @edad<>0
set @strWhere=@strWhere+' and DATEDIFF("m",convert(varchar,nacimiento,103),convert (varchar,getdate(),103))/12<= '
+ cast(@edad as varchar)

SET @strSQL = @strSelect + @strFrom + @strWhere

--SELECT a.* ,c.descCodDet as ciudad from PosI_Ficha a ,admin.dbo.detCodSys b ,admin.dbo.detCodSys c where id_pos<> '' and pais= 53 and 53 =b.idCodDet and ciudad= 56 and 56 =c.idCodDet
--SELECT * from PosI_Ficha where id_pos<> '' and DATEDIFF("m",convert(varchar,nacimiento,103),convert (varchar,getdate(),103))/12= 0
END
--print @strSQL
EXEC (@strSQL)

COMMIT TRANSACTION TX
回复
WangZWang 2005-07-21
用动态语句实现,灵活.
回复
zychenzy 2005-07-21
大侠们帮个忙,谢过大家了!
回复
zychenzy 2005-07-21
A B C D四个条件。
if A="" and B<>""AND C<>"" ADN D<>""then sql=......
IF b="" AND ......
这样的话就会有好多种组合,好像是16种,那执行效果不会很好吧,
大侠们怎样处理这种问题的!
回复
WangZWang 2005-07-21
declare @str varchar(8000)
Set @Str='select * from tbl where id=0 '
if ---
set @str=@str+' and ???'
----------- 之类的,这样组成的语句在效率上就有所改观
exec(@str)
回复
seu31199113 2005-07-21
要具体看你是什么条件了!
给一个例子,帮你分析分析
回复
mengzulin 2005-07-21
select * from table
where (id=@id or @id=null) and (name = @name or @name=null) and (age =@age or age<0)
回复
hsj20041004 2005-07-21
还是用IF then 比较好的。
这样好判断,代码也清晰,可读性强。
回复
zychenzy 2005-07-21
写一个让我看一下,先谢了。
回复
相关推荐
c#图片文字-字母-数字自动识别-深入代码-非常好
c#图片文字-字母-数字自动识别-深入代码-非常好
rtl8188eu_USB_linux.tar.gz
TP-LINK TL-WN725N V2 Linux 驱动安装
vs2013配置Qt5.7制作简单的音乐播放器
在VS2013配置Qt5.7制作的简单的音乐播放器,具有以下功能: 1.播放歌曲 2.添加歌曲 3.控制音量 4.换肤 5.本地搜索歌曲
24个带后台的小程序源码
24个带有后台的小程序源码下载,供大家交流学习(后台语言多种)
CListControl设置颜色
CListControl类派生,设置单元格颜色,丰富功能
SSIM 指标说明 文章
介绍 SSIM 图像评价指标和由来,比较一般的图像质量评价标准,比较ssim 和尖峰信噪比的差异,等等,是英文资料
Linux系统管理员/网络管理员(PDF版)
两本非常好的Linux系统学习的书 系统管理主要介绍Linux系统的结构、管理、命令等 网络管理主要从网络协议角度出发阐述Linux的网络功能
STM32F103中文数据手册
这个里面包含了STM32F103的各种型号的数据手册,方面理解
OpenGL ES2.0基础
初级学习OpenGL ES2.0的课程,从无到有,从进本的函数讲起,每一课时都附带一个例子程序。深入浅出的讲解可编程管线技术,令人费解的文理,以及混合技术,各种优化技术:顶点缓冲区,索引缓冲区,帧缓冲区,介绍精灵的使用,并使用shader制作粒子特效。 掌握OpenGL ES2.0可编程管线,以及OpenGLES2.0的特性,带领初学者入门。
QRegExp的详细解析
引言 正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如 表达式“ab+” 描述的特征是“一个 'a' 和 任意个 'b' ”,那么 'ab', 'abb', 'abbbbbbbbbb' 都符合这个特征。 正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。(3)用来替换,比普通的替换更强大。
WPF中用于嵌入其他进程窗口的自定义控件(AppContainer)
WPF中用于嵌入其他进程窗口的自定义控件(AppContainer) 具体见博文:http://blog.csdn.net/zzzwwwppp11199988899/article/details/78131292
MSP430_RTC模块学习总结
这是自己在学习MSP430时,对RTC模块的总结,希望可以帮助刚入门者
CIET-2019-0504 数据中心运维管理人才标准.pdf
数据中心运维管理,人才标准,欢迎查看共同学习。
《高效能人士的七个习惯》(英文版).pdf
《高效能人士的七个习惯》(英文版).pdf很不错的一本书~~~~~~~~~~~
winform常用控件
主要包含内容: 第一讲 课程简介 第二讲 Windows窗体-创建和介绍 第三讲 Windows窗体-属性 第四讲 Windows窗体-方法和事件 第五讲 Windows窗体-MDI窗体和子窗体 第六讲 控件的相关操作 第七讲 Label控件显示世界你好 第八讲Button控件 第九讲TextBox控件 第十讲RichTextBox控件 第十一讲ComboBox控件 等 学会winform常用控件基本使用
朴素贝叶斯算法做文本分类-代码
https://blog.csdn.net/zzZ_CMing/article/details/89478436 朴素贝叶斯算法做文本分类,用的是谭松波酒店语料。
FANUC的3210密码破解软件
FANUC 3210 密码破解软件,读取SRAM备份文件,不需要注册,完全免费。
PDB符号文件查看工具 symview,pdbxtract
PDB符号文件查看工具, 包含2个工具symview 和pdbxtract symview可查看文件所有原始信息 pdbxtract 可方便查看结构体等信息, 可导出头文件或xml
一个基于easyui的多人选择插件
花了一天时间实现的基于easyui的多人选择插件,是一个dailog
FANUC PMC密码破解程序
FANUC 31I PMC密码破解程序 用于OID,30I,31I等FANUC的密码破解
SIEMENS 840D SL调试手册.rar
里面含有840dsl的全部维修,调试,使用手册和资料,编程手册,报警诊断手册,PLC维修调试,系统报警代码,HMI高级手册.等.
airopeek汉化破解版无线WIFI网络密码破解无限制版
airopeek汉化破解版无线网络密码破解无限制版
FANUC B-64113C_01 0i-C 0i Mate-C连接说明书(硬件)册
FANUC B-64113C_01 0i-C 0i Mate-C连接说明书(硬件)册
B站王红元(codewhy)vue课件以及笔记
B站王红元(codewhy)vue课件以及笔记
英文停用词表
英文停用词表,1000个停用词左右,满足大部分的去停用词情况
Winfrom通用权限管理系统
Winfrom框架,动态生成菜单界面,附带数据库。纯手写,仅供学习参考,希望.net 程序员越来越好。 博客地址:https://blog.csdn.net/zzzzzzzert 有问题留言,互相学习交流
蓝桥物流软件
物流管理软件,很好的一个物流管理软件
常见密码的解密方法
一些常见的,密码的解密方法。
需求调研计划
需求调研计划--参考模板
中南大学大型数据库技术实验一、二
实验一:根据要求建立表,插入3个专业,每个专业不小于10个人,其中包括自己的信息。测试相关的完整性约束,并注意保留出错的提示,分析出错的原因。为每个学生建立相关用户,实现权限控制,每个学生可查询自己的信息,班长可查询本班所有学生信息; 为每个专业负责建立用户,每个专业负责可查询本专业所有学生信息。 实验二:设计与建立上课考勤表Attend_???。建立个人考勤汇总表stud_attend与专业考勤表major_attend。建立触发器,当对考勤表Attend表进行相应插入、删除、修改时,对stud表的sum_evaluation 数值进行相应的数据更新。 建立过程,生成某专业某时段(起、止日期)的考勤汇总表major_attend中各字段值,并汇总相应专业,将考勤分值的汇总结果写入到major表中的sum_evaluation中。
发帖
应用实例
创建于2007-09-28

2.7w+

社区成员

MS-SQL Server 应用实例
申请成为版主
帖子事件
创建了帖子
2005-07-21 12:51
社区公告
暂无公告