[英]how i can take order by while using nvarchar column in sql
我有這樣的查詢:
SELECT [Drug_id]
FROM tbl_Receiving
ORDER BY CAST(SUBSTRING([Drug_id], 3, LEN([Drug_ID])) as int)
但結果卻越來越好
A-1
A-10A
A-11
A-2
A-20A
A-21
A-22
A-3
A-30
A-31
但我需要以適當的升序進入。
A-1
A-2
A-3
A-10
A-11
我的[Drug_id]專欄是nvarchar(50)
如果字符串格式定義為您在示例數據中顯示的,則可以使用SUBSTRING和CHARINDEX在( - )之前拆分字符串,在( - )之后拆分INT值。 然后,您可以對它們進行排序以獲得所需的數據。
注意:當然,這些String操作存在性能問題。
SELECT *
FROM your_tabele
ORDER BY SUBSTRING(val,1,CHARINDEX('-',Val,1)-1),
CAST(SUBSTRING(val,CHARINDEX('-',Val,1)+1,LEN(val)-CHARINDEX('-',Val,1)) AS INT)
試試這個:運行此查詢
select substring(drug_id,1,CHARINDEX('-',drug_id)) + convert(varchar,cast(substring(drug_id,CHARINDEX('-',drug_id)+1,len(drug_id)) as int)) id from tbl_Receiving
order by cast(substring(drug_id,CHARINDEX('-',drug_id)+1,len(drug_id)) as int)
我基本上從這個答案中復制了這個: https : //stackoverflow.com/a/16667778/9101689
它使用patindex來識別數值的位置和子串的實際值。 我們使用該子字符串並使用LEFT函數將所有內容修剪到右側並將該值轉換為按順序排列的int。
declare @d table (drug_id nvarchar(max))
insert into @d values ('A-1'),('A-10A'),('A-11'),('A-2'),('A-20A'),('A-21'),('A-22'),('A-3'),('A-30'),('A-31')
SELECT *
FROM (
SELECT ORD_subsrt = SUBSTRING(drug_id, ORD_pos, LEN(drug_id)), *
FROM (
SELECT ORD_pos = PATINDEX('%[0-9]%', drug_id), *
FROM @d
) d
) t
Order by cast(LEFT(ORD_subsrt, PATINDEX('%[^0-9]%', ORD_subsrt + 't') - 1) as int)
添加值t,以便在drug_id字段上沒有非數字后綴的情況下,patindex'%[^ 0-9]%'將返回非零值。
或者可讀性較差:
SELECT *
From @d
Order by cast(LEFT(SUBSTRING(drug_id, PATINDEX('%[0-9]%', drug_id), LEN(drug_id)), PATINDEX('%[^0-9]%', SUBSTRING(drug_id, PATINDEX('%[0-9]%', drug_id), LEN(drug_id)) + 't') - 1) as int)
如果您具有類似“A2-10A”的值(或具有多個數值的任何值),則無法正常工作。
如果您的值始終為以下形式:
<letter>-<number><optional letter>
然后,你可以這樣做:
order by (case when drug_id like '%[A-Z]'
then len(drug_id) - 1 -- ignore the last character
else len(drug_id)
end)
drug_id
這將drug_id
視為一個字符串,使用長度來控制數字的排序。 它適用於:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.