多项查询如何做

hzcyclone 2008-03-12 01:47:53
比方说有如下几个查询选项
1.姓名
2.性别 int值
3.年龄
4.籍贯
5.生日 datatime值

可单独查询也可以多项查询
各位,这样的查询怎么做,sql怎么写?
...全文
224 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
ff167 2008-03-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hzcyclone 的回复:]
是的 就是你说的
假如有2个查询项 那就是有4种可能
select * from table where a=a
select * from table where b=b
select * from table where a=a and b=b
select * from table
4种情况 我大不了全部罗列出来 也无所谓

但是万一有10个查询项 那就是2的10次方种情况
这样穷举所有的情况,一一写出sql
我觉得总归是不现实的

至于select * from (select * from table where ……) where …… 那就是查询的嵌套 全是string值的时候可行[/Quote]

你的写法没必要。。。你是将简单问题复杂化了。

假如是10个条件,即使你的写法是成立的,也等于要在数据库里进行10次查询。数据量一大就完蛋了。

你还没理解我们说组成语句的意思,组语句根本不必先把所有情况罗列出来,而是应该需要一种情况才添加一种条件。

大约应该是这样写

string s1 = "select * from table";
然后
string s2 = " where 1=1"
当需要增加条件的时候,比如需要a=a的条件就这样
if (NeedA()) //判断方法名字只是我随便写的
s2 += " and a=a";
if (NeedB())
s2 += " and b=b";
...
这样写下去,1万个条件都能加进去。。。

然后整个查询串就是s1 + s2

完成。。。
fuda_1985 2008-03-13
  • 打赏
  • 举报
回复
把所有的条件全传进去,空的就传null,做一存储过程,把全部条件整合一下,再查,是不是也行呀!
hzcyclone 2008-03-13
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 ff167 的回复:]
引用 12 楼 hzcyclone 的回复:
是的 就是你说的
假如有2个查询项 那就是有4种可能
select * from table where a=a
select * from table where b=b
select * from table where a=a and b=b
select * from table
4种情况 我大不了全部罗列出来 也无所谓

但是万一有10个查询项 那就是2的10次方种情况
这样穷举所有的情况,一一写出sql
我觉得总归是不现实的

至于select * from (select * from …
[/Quote]

您的说法十分正确,昨,这个问题已经解决了,就是按您说的方法
lilixiong08 2008-03-12
  • 打赏
  • 举报
回复
public DataTable Fetch()
{
oleConn.Open();
string strSql="select * from Table";
oleDbDataAdapter oleDap=new oleDbDataAdapter(strSql,oleConn);
DataSet ds=new DataSet();
oleDap.Fill(ds);
return ds.Tables[0];
}
在用户界面写相应的语名就可以了
strSql中的Table是数据库的表名
谢谢支持
b哈利路亚d 2008-03-12
  • 打赏
  • 举报
回复
说下我的方法
写个方法获取查询条件,返回hashtable
public hashtable getJoken()
{
hashtable ht = new hashtable ();
if(string.isnullorempty(name.text))
{
ht.add("name",name.text);
}
...
}
然后再逻辑层判断条件
如果取到
ht["name"] == null
则放弃该条件
反之追加
" and name ='" + ht["name"]。tostring() + "'"
最后拼接成一个查询条件即可。
mobin4211 2008-03-12
  • 打赏
  • 举报
回复
只要判断传了几个参数就可以了,在用AND连接搞定,给分
xiaoyi8586 2008-03-12
  • 打赏
  • 举报
回复
全部用AND连接就可以了,我公司的匡架就是这样做的
hzcyclone 2008-03-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 meng_master 的回复:]
string sql = select * from table where 1=1 "
if(姓名!="")
{
sql += " or 姓名 ='" + 姓名 + "'"
}
if(姓名!="")
{
sql += " or 性别 ='" + 性别 + "'"
}
.......
应该用OR
估计楼主的意思是空的就不查,不空的就的参数就查
[/Quote]

应该是用and 属于联合查询
hzcyclone 2008-03-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ff167 的回复:]
如果只是查询条件的话,将它们组成一个string就可以了吧。。。

你的意思是sql语句可能是select * from table where a=a,select * from table where a=a and b=b等等查询条件不同的意思吧?不明白为什么会出现“select * from (select * from table where ……) where …… ”这种写法……

至于判断,那本身就是一定需要的。

写个实际例子?
[/Quote]

是的 就是你说的
假如有2个查询项 那就是有4种可能
select * from table where a=a
select * from table where b=b
select * from table where a=a and b=b
select * from table
4种情况 我大不了全部罗列出来 也无所谓

但是万一有10个查询项 那就是2的10次方种情况
这样穷举所有的情况,一一写出sql
我觉得总归是不现实的

至于select * from (select * from table where ……) where …… 那就是查询的嵌套 全是string值的时候可行
大宇_ 2008-03-12
  • 打赏
  • 举报
回复
string sql = select * from table where 1=1 "
if(姓名!="")
{
sql += " or 姓名 ='" + 姓名 + "'"
}
if(姓名!="")
{
sql += " or 性别 ='" + 性别 + "'"
}
.......
应该用OR
估计楼主的意思是空的就不查,不空的就的参数就查
ff167 2008-03-12
  • 打赏
  • 举报
回复
如果只是查询条件的话,将它们组成一个string就可以了吧。。。

你的意思是sql语句可能是select * from table where a=a,select * from table where a=a and b=b等等查询条件不同的意思吧?不明白为什么会出现“select * from (select * from table where ……) where …… ”这种写法……

至于判断,那本身就是一定需要的。

写个实际例子?

hzcyclone 2008-03-12
  • 打赏
  • 举报
回复
select * from (select * from table where ……) where ……

本来是想用嵌套的办法去做
假如查询值全是string值的话是可以实现的
但是问题是:里面有不少int值和datatime值

这样System.DateTime startDate = Convert.ToDateTime(TextBox3.Text.Trim());
假如TextBox3是空的话是转换不到datatime的
还是要去判断TextBox3是否为空

又回到问题的原点了

实在是苦恼 想不到解决的办法
AliexBoob 2008-03-12
  • 打赏
  • 举报
回复
要是单一查一个的.where后面加要查询的,还需要那么多条件干吗???直接姓名,年龄,差不多都筛选出来了吧.
AliexBoob 2008-03-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wweennbb 的回复:]
string sql = select * from table where 1=1 "
if(姓名!="")
{
sql += " and 姓名 ='" + 姓名 + "'"
}
if(姓名!="")
{
sql += " and 性别 ='" + 性别 + "'"
}
.......

或是直接用Like
[/Quote]

这样只能查出单一的姓名和性别,楼主应该不是想这样吧.
nj_1st_excellence 2008-03-12
  • 打赏
  • 举报
回复
需要作為查詢條件的就傳參數進來,不需要作為查詢條件的就直接穿"ALL"進來


select * from tablename where 姓名='@姓名' OR '@姓名'='ALL'
AliexBoob 2008-03-12
  • 打赏
  • 举报
回复
可以这样吧楼主,
string a="select "
if(XX = 姓名)
{
a+= 姓名,
}
if(XX = 性别)
{
a+= 性别,
}
...

string b= form 表

string sql=a+b;

不知道行不?我笨人就想到这么个笨法!!
wweennbb 2008-03-12
  • 打赏
  • 举报
回复
string sql = select * from table where 1=1 "
if(姓名!="")
{
sql += " and 姓名 ='" + 姓名 + "'"
}
if(姓名!="")
{
sql += " and 性别 ='" + 性别 + "'"
}
.......

或是直接用Like
hzcyclone 2008-03-12
  • 打赏
  • 举报
回复
ls的 不是这样的
应该是select * from table where 姓名=…………
然后有5个查询条件 都是可空的
就说是有32种可能
stg609 2008-03-12
  • 打赏
  • 举报
回复
select 姓名,性别,年龄,籍贯,生日 from table
hzcyclone 2008-03-12
  • 打赏
  • 举报
回复
假如分开写 那就有2*2*2*2*2=32种可能
那就要写32条sql 那样肯定不现实

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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