![](/img/trans.png)
[英]How do I sort an alphanumeric SQL Server NVARCHAR column in numerical order?
[英]I have a column with datatype nvarchar and I want to sort it in ascending order. How do I achieve it in SSRS?
這就是我得到的
這就是我想要的
我使用的查詢:
select *
from view_abc
order by col1
使用函數可以去除非數字字符並僅保留值。 使用另一個功能可以去除所有數字數據。 然后,您可以對兩個返回值進行排序。
一開始似乎有點工作,但是一旦功能啟用,您就可以在將來重新使用它們。 當我們從外部來源獲取數據時,這是我經常使用的兩個函數,但這些函數不是很規范。
它們可能不是世界上最有效的功能,但它們可以滿足我的目的
第一個功能只是保留數字部分。
CREATE FUNCTION [fn].[StripToAlpha]
(
@inputString nvarchar(4000)
)
RETURNS varchar(4000)
AS
BEGIN
DECLARE @Counter as int
DECLARE @strReturnVal varchar(4000)
DECLARE @Len as int
DECLARE @ASCII as int
SET @Counter=0
SET @Len=LEN(@inputString)
SET @strReturnVal = ''
WHILE @Counter<=@Len
BEGIN
SET @Counter = @Counter +1
SET @ascii= ASCII(SUBSTRING(@inputString,@counter,1))
IF(@ascii BETWEEN 65 AND 90) OR (@ascii BETWEEN 97 AND 122)
BEGIN
SET @strReturnVal = @strReturnVal + (SUBSTRING(@inputString,@counter,1))
END
END
RETURN @strReturnVal
END
第二個從文本字段中提取值的函數 , 它也可以處理百分比(例如abc 23%表示為0.23),但是在您的情況下不是必需的。
您需要先創建一個'fn'模式,以更改模式名稱...
CREATE FUNCTION [fn].[ConvertToValue]
(
@inputString nvarchar(4000)
)
RETURNS Float
AS
BEGIN
DECLARE @Counter as int
DECLARE @strReturnVal varchar(4000)
DECLARE @ReturnVal Float
DECLARE @Len as int
DECLARE @ASCII as int
SET @Counter=0
SET @Len=LEN(@inputString)
SET @strReturnVal = ''
IF @inputString IS NULL
BEGIN
Return NULL
END
IF @Len = 0 OR LEN(LTRIM(RTRIM(@inputString))) = 0
BEGIN
SET @ReturnVal=0
END
ELSE
BEGIN
WHILE @Counter<=@Len
BEGIN
SET @Counter = @Counter +1
SET @ascii= ASCII(SUBSTRING(@inputString,@counter,1))
IF(@ascii BETWEEN 48 AND 57) OR (@ascii IN (46,37))
BEGIN
SET @strReturnVal = @strReturnVal + (SUBSTRING(@inputString,@counter,1))
END
END
if RIGHT(@strReturnVal,1)='%'
BEGIN
SET @strReturnVal = LEFT(@strReturnVal,len(@strReturnVal)-1)
SET @strReturnVal = CAST((CAST(@strReturnVal AS FLOAT)/100) AS nvarchar(4000))
END
SET @ReturnVal = ISNULL(@strReturnVal,0)
END
RETURN @ReturnVal
END
現在我們已經創建了兩個函數,您只需執行
SELECT *
FROM view_abc
ORDER BY fn.StripToAlpha(Col1), fn.ConvertToValue(Col1)
嘗試這個
編輯:
SELECT CAST(SUBSTRING(ColumnNameToOrder, CHARINDEX(' ', ColumnNameToOrder, 0), LEN (ColumnNameToOrder)) AS INT) AS IntColumn, SUBSTRING(ColumnNameToOrder,0, CHARINDEX(' ', ColumnNameToOrder, 0)) AS CharColumn, * FROM view_abc ORDER BY Charcolumn, Intcolumn
您可以輸入包含諸如“ abc 123”之類的數據的列名,而不是ColumnNameToOrder。請告訴我它是否有效。
這就是我想出的。 也許它可以幫助您,或者至少為您指明正確的方向。
我測試了值。 當值的值為零時 ,順序就像您希望的順序一樣。 像這樣:
因此,您可以運行此查詢以更新現有值,添加零 。
UPDATE abc
SET col1 = 'abc 0' + SUBSTRING(col1, 5, 1)
WHERE LEN(col1) = 5
或者,如果前三個字符不同,則可以執行上述查詢:
UPDATE abc
SET col1 = (SUBSTRING(col1, 1, 3) + ' 0' + SUBSTRING(col1, 5, 1))
WHERE col1 LIKE 'abc__'
僅當當前String的長度為5時,這才會覆蓋col1列中的現有值。
然后,您可以運行以下查詢以獲取結果:
SELECT col1
FROM abc
ORDER BY col1 ASC
=cint(right(Fields!Col1.Value, instrrev(Fields!Col1.Value, " ")-1))
這將在SSRS中工作並正確排序,但是僅在Col1始終包含空格並且空格之后的字符可以轉換為整數的情況下才有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.