乙個sql動態排序的問題,弄了我很久很久。就是無法解決。結果在網上找了一段資源幫我解決。如下:
sql排序方法,exec法和case when法
在日常的報表中常用到排序,有些是多字段的公升,降序,一般有兩種方法,如下所示:
create table #tmp
(row int,
id nvarchar(10),
des nvarchar(20))go
insert into #tmp(row, id, des)
select 1, '1', '30'
union select 2, '2', '10'
union select 3, '1', '10'
union select 4, '3', '15'
--'1'=>row desc,'2'=>id asc,row desc '3'=>id asc, des desc
declare @ordertype nvarchar(1)
set @ordertype='3'
--exec作法
declare @sqlstr nvarchar(200)
set @sqlstr='select * from #tmp'
if @ordertype='1'
set @sqlstr=@sqlstr+' order by row desc'
else if @ordertype='2'
set @sqlstr=@sqlstr+' order by id, row desc'
else if @ordertype='3'
set @sqlstr=@sqlstr+' order by id, des desc'
exec(@sqlstr)
--以上方法不易閱讀及維護,還有額外變數
select *
from #tmp
order by case when @ordertype='1' then row end desc,
case when @ordertype='2' then id end,
case when @ordertype='2' then row end desc,
case when @ordertype='3' then id end,
case when @ordertype='3' then des end desc;
--結果一致,case when 方法不存在以上問題
這裡我一直產生了乙個疑慮:case問什麼可以進行多次的使用來進行排序呢。原理很簡單:order by 是針對查詢出來的結果集進行排序。現有結果集,然後再由排序。第乙個case只是針對@ordertype=1的進行排序,第二個則是增對@ordertype='2'進行排序。
在日常的報表中常用到排序,有些是多字段的公升,降序,一般有兩種方法,如下所示:
create table #tmp
(row int,
id nvarchar(10),
des nvarchar(20))go
insert into #tmp(row, id, des)
select 1, '1', '30'
union select 2, '2', '10'
union select 3, '1', '10'
union select 4, '3', '15'
--'1'=>row desc,'2'=>id asc,row desc '3'=>id asc, des desc
declare @ordertype nvarchar(1)
set @ordertype='3'
--exec作法
declare @sqlstr nvarchar(200)
set @sqlstr='select * from #tmp'
if @ordertype='1'
set @sqlstr=@sqlstr+' order by row desc'
else if @ordertype='2'
set @sqlstr=@sqlstr+' order by id, row desc'
else if @ordertype='3'
set @sqlstr=@sqlstr+' order by id, des desc'
exec(@sqlstr)
--以上方法不易閱讀及維護,還有額外變數
select *
from #tmp
order by case when @ordertype='1' then row end desc,
case when @ordertype='2' then id end,
case when @ordertype='2' then row end desc,
case when @ordertype='3' then id end,
case when @ordertype='3' then des end desc;
--結果一致,case when 方法不存在以上問題
利用sql報錯幫助進行sql注入
我們可以利用sql報錯幫助進行sql注入,這裡以sql server 為例 sql查詢時,若用group by子句時,該子句中的字段必須跟select 條件中的字段 非聚合函式 完全匹配,如果是select 那就必須將該表中所有列名都包含在group by 中 若少了哪個,就會報錯,報錯中會提示如下...
關於SQL的case when魅力
最近去面試碰到了兩道關於資料庫的筆試題目 1 有member表 m id int,m varchar 20 其中m 有三個不同值 男 女 null 要求用一條sql語句把member表的m 字段更新成m 的值 男 變成 女 女 變成 男 null 不變 答 update member set m c...
sql 中case when 基礎使用
sql 語句中 case when then 簡單使用 因為表很簡單,就不為大家展示建表的 了 select from user 結果如圖 when 1 then 男 when 2 then 女 else 寵物 end 性別 from user u 查詢結果如下 從中可以看出我們的case函式是作為...