利用case when進行sql動態排序

2022-09-16 08:45:11 字數 2593 閱讀 3018

乙個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函式是作為...