sql字元數字排序
A. sql字元型欄位按數字型欄位排序實現方法
這是很久之前的就遇到的問題了,去年寫了個WP插件:WordPress投票插件Ludou
Simple
Vote,由於有些使用者需要一個投票排行榜,所以需要用一條SQL來讀取按得分排序的文章列表。
Ludou
Simple
Vote的投票得分結果是以自定義欄目的方式存儲在WordPress的postmeta中,分值存放在meta_value欄位,而meta_value欄位類型是longtext,如果直接使用下面的SQL查詢語句來排序:
復制代碼
代碼如下:
ORDER
BY
`meta_value`
那麼按得分排序得到的結果可能是:
1
10
11
123
1234
2
25
253
3
由於是按字母順序排列,所以123排在了2的前面,顯然不符合我們的要求,那麼怎樣才能按照我們預想的數字順序排序呢?下面介紹兩種方法。
一、採用MySQL的cast函數,轉換欄位格式
這里我們將meta_value欄位轉換成數值類型的欄位DECIMAL,然後再進行排序:
復制代碼
代碼如下:
ORDER
BY
CAST(`meta_value`
AS
DECIMAL)
需要注意的是,你所要排序的meta_value欄位的值必須都是可轉換成數字,否則將會出錯。
二、使用MySQL絕對值函數ABS
使用MySQL絕對值函數ABS,它告訴MySQL使用絕對值來處理處理這個欄位:
復制代碼
代碼如下:ORDER
BY
ABS(`meta_value`)
B. sql 數字+字元+數字排序問題
SELECT*FROMt3ORDERBY
CAST(LEFT(name,patindex('%[a-z,A-Z]%',right(name,len(name)-patindex('%[0-9]%',name))))ASINT),
SUBSTRING(NAME,patindex('%[a-z,A-Z]%',right(name,len(name)-patindex('%[0-9]%',name)+1)),1),
CAST(RIGHT(name,len(name)-patindex('%[a-z,A-Z]%',right(name,len(name)-patindex('%[0-9]%',name)+1)))ASINT)
就是麻煩點,其中的name列就是你的
1A2
3A2
3A10.....進行排序的列,改一下就好了,不管你第一個數字
或第二個數字有多少位都可以排序,只要你的字母在數字中只有一位就只有可以。
C. SQL字元串中加入數字怎麼排列
原有表中的點擊次數用的是 字元串型,現要求按點擊次數排序,
select * from table t order by t.click desc
查出的是按左對齊排序的
99
97
9
89
783
7
而我要求的是按數字大小排的序
要修改為
select * from table t order by cast (t.click as int) desc
783
99
97
89
9
7
D. sql 字母數字組合 排序
截取分段排序
orderbyleft(kh,charindex('-',kh)-1)
,convert(int,substring(kh,charindex('-',kh)+1,charindex('-',kh,charindex('-',kh)+1)-charindex('-',kh)-1))
,right(kh,len(kh)-charindex('-',kh,charindex('-',kh)+1))
E. SQL 字母+數字排序
排序規則名稱由兩部份構成,前半部份是指本排序規則所支持的字元集。
如:
Chinese_PRC_CS_AI_WS
前半部份:指UNICODE字元集,Chinese_PRC_指針對大陸簡體字UNICODE的排序規則。
排序規則的後半部份即後綴 含義:
_BIN 二進制排序
_CI(CS) 是否區分大小寫,CI不區分,CS區分
_AI(AS) 是否區分重音,AI不區分,AS區分
_KI(KS) 是否區分假名類型,KI不區分,KS區分
_WI(WS) 是否區分寬度 WI不區分,WS區分
區分大小寫:如果想讓比較將大寫字母和小寫字母視為不等,請選擇該選項。
區分重音:如果想讓比較將重音和非重音字母視為不等,請選擇該選項。如果選擇該選項,
比較還將重音不同的字母視為不等。
區分假名:如果想讓比較將片假名和平假名日語音節視為不等,請選擇該選項。
區分寬度:如果想讓比較將半形字元和全形字元視為不等,請選擇該選項
F. sql數字字元串排序
--負責把字元串轉換為Varbinary
--思路,把字元串按.拆分,然後轉換成int,再轉換成varbinary拼接
CreateFunctionf_Order(@SourceSqlVarchar(8000),@StrSeprateVarchar(2))
ReturnsVarbinary(8000)
As
Begin
Declare@tempVarbinary(8000)=0x0
Declare@chVarchar(100)
Set@SourceSql=@SourceSql+@StrSeprate
While(@SourceSql<>'')
Begin
Set@ch=left(@SourceSql,Charindex(@StrSeprate,@SourceSql,1)-1)
Set@temp=@temp+Convert(Varbinary,Convert(Int,@ch))
Set@SourceSql=Stuff(@SourceSql,1,Charindex(@StrSeprate,@SourceSql,1),'')
End
Return@temp
End
Go
--建表
CreatetableT
(
AVarchar(100)
)
--插入數據
InsertIntoTValues('1.1')
InsertIntoTValues('1.1.1')
InsertIntoTValues('1.1.2')
InsertIntoTValues('1.2')
InsertIntoTValues('10.1')
InsertIntoTValues('10.1.1')
InsertIntoTValues('10.1.2')
InsertIntoTValues('11.1')
InsertIntoTValues('2.1')
InsertIntoTValues('3.1')
InsertIntoTValues('4.1')
--測試
Select*fromT
orderbydbo.f_Order(A,'.')
G. sql 字元與數字排序
Sql給你,分給我
轉換asc碼,簡潔方便
1是49 a是97 z就是123 只要讓數字的碼都大於字母就可以了,73是可以根據情況改的,要是有大寫情況,也能處理
select Id from a order by (case when isNumEric(Id)=1 then ascii(Id)+73 else ascii(Id) end)
H. sql語句中對一個欄位排序,欄位中含有字元串和數字,(怎根據數字進行排序)
order by 欄位名稱+0 desc/asc的形式進行排序
order by 欄位名稱*1 desc/asc的形式進行排序