簡體   English   中英

我如何在sql中使用nvarchar列時獲取順序

[英]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)

假設您的格式始終為A-<NUMBER> ,您可以始終執行以下操作:

SELECT 
    [Drug_id]
FROM 
    tbl_Receiving
ORDER BY 
    CAST(SUBSTRING([Drug_id], 3, LEN([Drug_ID])) as int)

然后,這將僅嘗試從數字轉換為int

輸出如下:

在此輸入圖像描述

如果字符串格式定義為您在示例數據中顯示的,則可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM