Sql-Server

SQL 按特定字母排序

  • April 28, 2017

BarDetailId 表

@BarId AS INTEGER

AS
BEGIN
   SET NOCOUNT ON

BEGIN
  SELECT [BarDetailId]
 ,[BarId]
 ,[Member]
 ,[MemberNo]
 ,[BarMark]
 ,[TypeSize]
 ,[BarLength]
 ,[BarNo]
 ,[BarTotal]
 ,[ShapeCode]
 ,[ShapeImage]
 ,(SELECT CASE WHEN DimA <> 0 THEN 'A=' + CONVERT(VARCHAR, CAST(DimA AS 
  Decimal(18, 0))) 
   ELSE '' END + CASE WHEN DimB <> 0 THEN 
       ', B=' + CONVERT(VARCHAR, CAST(DimB AS Decimal(18, 0)))
   ELSE '' END + CASE WHEN DimC <> 0 THEN 
       ', C=' + CONVERT(VARCHAR, CAST(DimC AS Decimal(18, 0))) 
   ELSE '' END + CASE WHEN DimD <> 0 THEN 
       ', D=' + CONVERT(VARCHAR, CAST(DimD AS Decimal(18, 0))) 
   ELSE '' END + CASE WHEN DimE <> 0 THEN 
       ', E=' + CONVERT(VARCHAR, CAST(DimE AS Decimal(18, 0))) 
   ELSE '' END + CASE WHEN DimF <> 0 THEN 
       ', F=' + CONVERT(VARCHAR, CAST(DimF AS Decimal(18, 0))) 
   ELSE '' END + CASE WHEN DimG <> 0 THEN 
       ', G=' + CONVERT(VARCHAR, CAST(DimG AS Decimal(18, 0))) 
   ELSE '' END + CASE WHEN DimN <> 0 THEN 
       ', N=' + CONVERT(VARCHAR, CAST(DimN AS Decimal(18, 0))) 
   ELSE '' END) AS Dimension
 ,[DimA]
 ,[DimB]
 ,[DimC]
 ,[DimD]
 ,[DimE]
 ,[DimF]
 ,[DimG]
 ,[DimN]
 ,[Remark]
 ,[Active]
 ,[CreatedDtTm]
 ,[CreatedBy]
 ,[CreatedIp]
 ,[UpdatedDtTm]
 ,[UpdatedBy]
 ,[UpdatedIp]
  FROM BAR_SCHEDULE_DETAIL WHERE Active = 1 AND BarId = @BarId 

  END
  END

我想按 Typesize 排序,第一個字母 T 然後數字,然後以字母 R 開頭,我嘗試了很多範例,但它似乎無法正常執行。例如,我希望訂單類似於 T10、T12、T16、R10、R12、R16

如果我正確理解您的問題,您只需先按 TypeSize 的第一個字元排序(降序),然後按升序對同一列的下 4 個字元進行排序。

在以下範例解決方案中,我使用該SUBSTRING函式“挑選”第一個字元並按降序對其進行排序(因此 ‘T’,s 將位於 ‘R’s 之前),然後我使用該SUBSTRING函式“挑選”接下來的 3 個字元並按升序對其進行排序。

函式的第三個參數SUBSTRING引用長度。TypeSize 列是可變長度的,因此您不能簡單地將數字“4”硬編碼為長度參數。 R06.8在第一個字元之後有 4 個字元,而R10只有 3 個字元。如果您將數字 4 硬編碼為SUBSTRING函式的長度,則在處理該數據時可能會出錯。這就是為什麼我使用該函式“計算”其餘數據的長度,LEN然後減去 1,因為這讓我超過了第一個字元。R06.8的數據長度總共是 5 個字元,因此減去 1 可以得到該SUBSTRING函式的正確數據長度。R10的數據長度只有 3 個字元,所以減去 1 也會給我適當的數據長度。

declare @Test table (col1 nvarchar(5))
insert into @test values('T10'), ('T12'), ('T16'), ('R06.8'), ('R08.3'), ('R10')

select * from @Test order by substring(Col1,1,1) desc, substring(col1,2,len(col1)-1)

正如我在評論中指出的那樣,解決這個問題可能有很多(並且可能更有效)的方法。希望你能理解我的解決方案。如果我誤解了您的要求,請告訴我。

引用自:https://dba.stackexchange.com/questions/171888