2016-11-05 80 views
2

我有一個包含數字和字符串值的表。我需要應用自定義排序如下所述: -在Microsoft SQL Server中進行排序和自定義排序

CREATE TABLE [dbo].[TEST] 
(
    [Tag] [nvarchar](max) NULL, 
    [Category] [nvarchar](max) NULL, 
    [LE] [nvarchar](max) NULL, 
    [Description] [nvarchar](max) NULL, 
    [Row_Id] [int] NOT NULL, 

    CONSTRAINT [PK_testsirius_TEST_0_Row_Id] 
     PRIMARY KEY CLUSTERED ([Row_Id] ASC) 
) 

Insert into TEST values (1,'Area','EMR','A',199) 
Insert into TEST values (2,'Area','EMR','B',200) 
Insert into TEST values (3,'Area','EMR','C',201) 
Insert into TEST values (201,'Area','EMR','1',399) 
Insert into TEST values (202,'Area','EMR','2',400) 
Insert into TEST values (203,'Area','EMR','3',401) 

的例外輸出:

select * 
from TEST 
order by asc 

輸出:

1 
2 
3 
A 
B 
C 

電流輸出:

C 
B 
A 
3 
2 
1 

要求:

  • 如果排序方向是[↑]然後第一個排序所有從最小到最大的數值,然後進行排序的所有時間值從最舊到最新,然後排序所有的文本值從A到Z
  • 如果排序方向爲[↓],則首先將所有文本值從Z排序到A,然後將所有時間值從最新到最舊排序,然後將所有數值從最大到最小排序
  • 排序時,始終將底部的空白單元格。
+0

你已經嘗試過了什麼? –

+0

你的問題不清楚!請添加更多細節;)。 –

+0

在一個表格列描述(varchar(max)列中,我想要應用過濾器,如下所述: - \t如果排序方向爲[↑],那麼首先將所有數值從最小值排序到最大值,然後排序所有時間然後將所有文本值從A排序到Z - \t如果排序方向爲[↓],則先將所有文本值從Z排序到A,然後將所有時間值從最新到最舊排序,然後將所有數值從最大到最小排序 - \t排序時,請始終將空白單元格放在最下面 – nirav

回答

1

您可以使用ISNUMERIC()。

select * 
from TEST 
order by CASE WHEN isNumeric(Description) = 1 THEN Cast([Description] as int) ELSE 2147483647 END 
, Description 

- 用於從高到低的順序,你可以使用-1 *一些維護的幅度,但是顛倒了順序的數學思想...

select * 
from TEST 
order by CASE WHEN isNumeric(Description) = 1 THEN Cast([Description] as int) *  -1 ELSE -2147483648 END 
, Description desc 

- 與額外的測試案例12345

CREATE TABLE [dbo].[TEST] 
(
    [Tag] [nvarchar](max) NULL, 
    [Category] [nvarchar](max) NULL, 
    [LE] [nvarchar](max) NULL, 
    [Description] [nvarchar](max) NULL, 
    [Row_Id] [int] NOT NULL, 

    CONSTRAINT [PK_testsirius_TEST_0_Row_Id] 
     PRIMARY KEY CLUSTERED ([Row_Id] ASC) 
) 

Insert into TEST values (1,'Area','EMR','A',199) 
Insert into TEST values (2,'Area','EMR','B',200) 
Insert into TEST values (3,'Area','EMR','C',201) 
Insert into TEST values (201,'Area','EMR','1',399) 
Insert into TEST values (202,'Area','EMR','2',400) 
Insert into TEST values (203,'Area','EMR','3',401) 
Insert into TEST values (204,'Area','EMR','12345',402) 

select * 
from TEST 
order by CASE WHEN isNumeric(Description) = 1 THEN Cast([Description] as int) ELSE 2147483647 END 
, Description 


-- example output 

Tag Category LE Description Row_Id 
201 Area EMR 1 399 
202 Area EMR 2 400 
203 Area EMR 3 401 
204 Area EMR 12345 402 
1 Area EMR A 199 
2 Area EMR B 200 
3 Area EMR C 201 

- 從大到小的順序

select * 
from TEST 
order by CASE WHEN isNumeric(Description) = 1 THEN Cast([Description] as int) * -1 ELSE -2147483648 END 
, Description desc 

-- example output 

Tag Category LE Description Row_Id 
3 Area EMR C 201 
2 Area EMR B 200 
1 Area EMR A 199 
204 Area EMR 12345 402 
203 Area EMR 3 401 
202 Area EMR 2 400 
201 Area EMR 1 399 
+0

HI,請檢查「select * from TEST order by CASE WHEN isNumeric(Description)= 1 THEN Cast([Description] as int)ELSE 2147483647 END ,Description desc」not working。 – nirav

+0

我在問題中添加了需求。請通過它。 – nirav

4
SELECT * 
FROM TEST 
ORDER BY CASE WHEN Description NOT LIKE '%[^0-9]%' THEN 0 ELSE 1 END, 
     LEN(Description), 
     Description 
+0

不是。它不能正常工作。當我插入數據12564時,它顯示在第二行。如:1,12564,2,3,4,A,B,C,D – nirav

+0

請檢查相同的順序..desc不工作.. – nirav

+1

@nirav如果你想降序,那麼你爲什麼不問你的問題呢? –

0

你有沒有嘗試過這樣的:

select * 
from TEST 
order by case when Description not like '%[0-9]%' then 1 else 0 end, Description 
+0

不是。它不能正常工作。當我插入數據12564時,它顯示在第二行。如:1,12564,2,3,4,A,B,C,D – nirav

+0

我在問題中添加了需求。請通過它。 – nirav