请教select排序 及 存储过程中 参数 的处理
请问:
1、假设有这么个查询:
SELECT COL1,COL2
FROM DB_TEST
WHERE COL2 = 1
现在要对取得的结果根据 COL1 进行排序,要求当 COL1 的内容为空(NULL)时,不管,是按升序还是降序排,NULL都要在最后,这要如何实现呢?
2、存贮过程中,可以定义可选参数么?要如何实现呢?
问题点数:80、回复次数:26Top
1 楼dawugui(潇洒老乌龟)回复于 2006-10-28 10:57:02 得分 0
SELECT COL1,COL2
FROM DB_TEST
WHERE COL2 = 1 and col1 is not null
order by col1
union all
SELECT COL1,COL2
FROM DB_TEST
WHERE col1 is null
Top
2 楼bjgzxx(食人一族)回复于 2006-10-28 11:04:08 得分 0
楼上正解Top
3 楼playwarcraft(时间就像乳沟,挤挤还是有的)回复于 2006-10-28 11:05:13 得分 15
樓上的不對的...
1.
SELECT COL1,COL2
FROM DB_TEST
WHERE COL2 = 1
--順序
order by case when col1 is null then 2
else 1 end,COL1
--倒序
--order by case when col1 is null then 2
else 1 end,COL1 descTop
4 楼playwarcraft(时间就像乳沟,挤挤还是有的)回复于 2006-10-28 11:09:19 得分 5
2.什麼叫可選參數???
還是指有默認值的參數??
筆如:
create proc usp_test
@a char(01),
@b char(01)='b'
as
print @a+@b
go
exec dbo.usp_test 'a'
--結果ab
exec dbo.usp_test 'a','c'
--結果acTop
5 楼xyxfly(All things are difficult before they are easy.)回复于 2006-10-28 11:12:23 得分 5
1.楼上正解:)order by case
2.在baidu里搜“不定参数存储过程”
Top
6 楼gracecode()回复于 2006-10-28 11:21:17 得分 0
可能用词不当,“可选参数”在这儿想表达的是:如果能接收到这个参数就用它,要是调用这个存储过程的那方 没有 给我传来这个参数,那就不用它。
谢谢。Top
7 楼playwarcraft(时间就像乳沟,挤挤还是有的)回复于 2006-10-28 11:37:01 得分 5
可能用词不当,“可选参数”在这儿想表达的是:如果能接收到这个参数就用它,要是调用这个存储过程的那方 没有 给我传来这个参数,那就不用它。
谢谢。
-----------------------------------------------------------
用上面那個賦默認的方法,好像也可以搞了?Top
8 楼xyxfly(All things are difficult before they are easy.)回复于 2006-10-28 12:00:43 得分 5
如果能接收到这个参数就用它,要是调用这个存储过程的那方 没有 给我传来这个参数,那就不用它。
搜了没?呵呵,就可以搞定你的问题啊
Top
9 楼dssw(易腾软件--开发软件的软件 http://www.etoward.com/)回复于 2006-10-28 12:16:48 得分 5
如果没有参数判断一下
存储过程好像没有可选参数这一说。Top
10 楼gracecode()回复于 2006-10-28 12:18:12 得分 0
^_^ 搜了,正在看。谢谢。 这贴先不结先,担心看后还有不明白的,还想再请教。Top
11 楼dssw(易腾软件--开发软件的软件 http://www.etoward.com/)回复于 2006-10-28 12:20:39 得分 0
在使用 union 是 不可以有 order by 关键字。Top
12 楼Hopewell_Go(好的在后頭﹗希望更好﹗﹗)回复于 2006-10-28 12:43:25 得分 5
--升序
select *
from a
order by isnull(f2,'zzzzzzzzzzzz')--当为升序时设置为最大的值
--降序
select *
from a
order by f2 desc
--------至于楼主可以传递参数进行动态设置Top
13 楼Hopewell_Go(好的在后頭﹗希望更好﹗﹗)回复于 2006-10-28 12:48:33 得分 15
1、假设有这么个查询:
SELECT COL1,COL2
FROM DB_TEST
WHERE COL2 = 1
现在要对取得的结果根据 COL1 进行排序,要求当 COL1 的内容为空(NULL)时,不管,是按升序还是降序排,NULL都要在最后,这要如何实现呢?
2、存贮过程中,可以定义可选参数么?要如何实现呢?
create proc test
@iSortType int--排序类型,0为降序,1为升序
as
if(@iSortType=0)--降序
begin
SELECT COL1,COL2
FROM DB_TEST
WHERE COL2 = 1
order by col1 desc
end
else if(@iSortType=1)--升序
begin
SELECT COL1,COL2
FROM DB_TEST
WHERE COL2 = 1
order by isnull(col1,'zzzzzzzzzzzzzzzzz')--这个要看字段定义的数据类型长度
end
--测试
--降序
exec test 0
--升序
exec test 1Top
14 楼xyxfly(All things are difficult before they are easy.)回复于 2006-10-28 13:16:55 得分 0
在使用 union 是 不可以有 order by 关键字。
这个问题就不用回答了,自己试一下就知道了,呵呵,自己多动手试试Top
15 楼gracecode()回复于 2006-10-28 13:28:05 得分 0
SELECT COL1,COL2
FROM DB_TEST
WHERE COL2 = 1
--順序
order by case when col1 is null then 2
else 1 end,COL1
--倒序
--order by case when col1 is null then 2
else 1 end,COL1 desc
前边 playwarcraft(时间就像乳沟,挤挤还是有的) 兄弟给的这个方法,调试结果是正确的,可是不明白其中的意思,能够解释一下不?
“order by case when col1 is null then 2
else 1 end,COL1 ”这么句话的意思是什么呢??
Top
16 楼xyxfly(All things are difficult before they are easy.)回复于 2006-10-28 13:40:26 得分 5
看连接帮助case when的用法
上面的意思是当col1为空设为2,否则设为1,然后按这个排序
所以null肯定排在后面了Top
17 楼xyxfly(All things are difficult before they are easy.)回复于 2006-10-28 13:40:55 得分 0
打错了,是联机帮助 -_-Top
18 楼gracecode()回复于 2006-10-28 14:02:02 得分 0
嗯,看语句我也是这么想的,可是:
假设 col1 原来的内容为:
------------------------
B
C
NULL
A
NULL
D
------------------------
则,执行case 之后是不是就是:
------------------------
B ---〉 1
C ---〉 1
NULL ---〉 2
A ---〉 1
NULL ---〉 2
D ---〉 1
------------------------
那这样子的话,它是怎么实现下边这个结果的呢?
------------------------
A
B
C
NULL
NULL
------------------------
能解释一下不?谢谢 ^_^
Top
19 楼xyxfly(All things are difficult before they are easy.)回复于 2006-10-28 14:08:15 得分 0
2不应该排在1后面吗?
还是自己多摸索摸索吧,呵呵,不能一有问题就问,当然,如果想不出来来这里讨论讨论也不错
呵呵,说的不对请见谅Top
20 楼xyxfly(All things are difficult before they are easy.)回复于 2006-10-28 14:11:27 得分 5
create table test(A varchar(10), B int)
insert test
select 'B',1 union all
select 'C',1 union all
select NULL,2 union all
select 'A',1 union all
select NULL,2 union all
select 'D',1
select * from test order by b,a
--------------------
A B
---------- -----------
A 1
B 1
C 1
D 1
NULL 2
NULL 2Top
21 楼xyxfly(All things are difficult before they are easy.)回复于 2006-10-28 14:12:02 得分 0
上面的例子明白?Top
22 楼playwarcraft(时间就像乳沟,挤挤还是有的)回复于 2006-10-28 14:19:08 得分 0
order by case when col1 is null then 2
else 1 end
,COL1
----------
因為後面還有,COL1你沒看到吧,
是先按case排序(也就是不是NULL的為1排前面,是NULL的為2排後面)
然後再按COL1本身排.Top
23 楼playwarcraft(时间就像乳沟,挤挤还是有的)回复于 2006-10-28 14:21:31 得分 10
以你給的例子:
B
C
NULL
A
NULL
D
------------------
1.先按case排序
B
C
A
D
NULL
NULL
2.再按COL1排序
A
B
C
D
NULL
NULLTop
24 楼gracecode()回复于 2006-10-28 14:27:32 得分 0
嗯,看了 playwarcraft(时间就像乳沟,挤挤还是有的) 兄的解释,现在明白了。
谢谢 xyxfly(天使不敢走的路,傻子一步就能跨过去......) 兄的提醒,我会注意的 :)
遇到的问题,在最开始给出处理办法的时候,已经解决了,是不理解其中的意思,所以后边又问了这么多,sorryTop
25 楼xyxfly(All things are difficult before they are easy.)回复于 2006-10-28 14:59:29 得分 0
-_-Top
26 楼lsd1025()回复于 2006-10-29 11:09:22 得分 0
学习了一下,Top




