Sql-Server
SQL 按特定字母排序
@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)
正如我在評論中指出的那樣,解決這個問題可能有很多(並且可能更有效)的方法。希望你能理解我的解決方案。如果我誤解了您的要求,請告訴我。