我在使用COALESCE关键字制作的单元格上有逗号分隔列表,如下所示:
SELECT
@RelatorFirmDeals = COALESCE(@RelatorFirmDeals + ', ', '') + ISNULL(H.dtm_unittypename, '') + '-' + ISNULL(CAST(H.dtm_unitno as nvarchar(5)), '')
FROM
FilteredOpportunity O
INNER JOIN
Filtereddtm_unit H ON O.pcrm_homeid = H.dtm_unitid
WHERE
O.dtm_project = @ProjectId AND
NOT O.pcrm_rdeid IS NULL AND
O.statuscode = 265780001
如何对此列表进行排序?
由于
答案 0 :(得分:0)
这是一种适合您的方法。
首先,从this问题的答案中获取udf_Split
用户定义函数(UDF)。使用此UDF,您可以将分隔的字符串作为参数传递,并返回一个表,每个值都有一行。
一旦你有了这个,那么你需要做的就是以下面的方式使用UDF。
DECLARE @RelatorFirmDeals VARCHAR(8000) = 'G2-18, G3-21, G2-13, G-15, G1-16, G2-17, G3-9, G1-11, G2-12, B2-22, B-23, B-24, B1-25, B-28, B-29, B-30, B2-31, F2-69, F-70, F-71, F-72'
SELECT LTRIM(STUFF((SELECT ', ' + RTRIM(LTRIM(Value))
FROM dbo.udf_Split(@RelatorFirmDeals, ',')
ORDER BY 1 FOR XML PATH ('')), 1, 2, ''));
这将是结果字符串:
B-23, B-24, B-28, B-29, B-30, B1-25, B2-22, B2-31, F-70, F-71, F-72, F2-69, G-15, G1-11, G1-16, G2-12, G2-13, G2-17, G2-18, G3-21, G3-9
希望这会有所帮助。
答案 1 :(得分:0)
这基本上是分解字符串并将其放入表变量,对表进行排序,然后将其放回字符串中。有一点需要注意的是,由于它被排序为一个字符串而不是整数,G-9将在G-10之后。如果你想按字母顺序对数字进行排序,那么你需要将字符串分为2列,1表示字母,1表示数字,然后进行相应的排序。
如果您有SQL Server 2016,则可以使用string_split函数简化此操作。
以下是查询:
DECLARE @input_string NVARCHAR(MAX) = 'G2-18, G3-21, G2-13, G-15, G1-16, G2-17, G3-9, G1-11, G2-12, B2-22, B-23, B-24, B1-25, B-28, B-29, B-30, B2-31, F2-69, F-70, F-71, F-72'
DECLARE @delimiter NVARCHAR(MAX) = ', '
DECLARE @output_string NVARCHAR(MAX) = ''
DECLARE @values_table TABLE (
string_values NVARCHAR(MAX)
)
WHILE (SELECT LEN(@input_string) - LEN(REPLACE(@input_string,@delimiter,''))) > 0
BEGIN
INSERT @values_table
SELECT SUBSTRING(@input_string,0,CHARINDEX(', ',@input_string))
SET @input_string = SUBSTRING(@input_string,CHARINDEX(@delimiter,@input_string)+2,LEN(@input_string))
END
INSERT @values_table
SELECT @input_string
DECLARE @row_counter INT = 1
WHILE @row_counter <= (SELECT COUNT(*) FROM @values_table)
BEGIN
SET @output_string = @output_string + (
SELECT
string_values
FROM (
SELECT
string_values
,ROW_NUMBER() OVER (ORDER BY string_values) AS row_num
FROM @values_table) sub_query
WHERE row_num = @row_counter) + @delimiter
SET @row_counter = @row_counter + 1
END
SELECT SUBSTRING(@output_string,0,LEN(@output_string)-2)
以下是UDF的TSQL,它接受一个输入字符串进行排序,并使用分隔符将其拆分。
CREATE FUNCTION udf_order_string(@input_string NVARCHAR(MAX), @delimiter NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @output_string NVARCHAR(MAX) = ''
DECLARE @values_table TABLE (
string_values NVARCHAR(MAX)
)
WHILE (SELECT LEN(@input_string) - LEN(REPLACE(@input_string,@delimiter,''))) > 0
BEGIN
INSERT @values_table
SELECT SUBSTRING(@input_string,0,CHARINDEX(', ',@input_string))
SET @input_string = SUBSTRING(@input_string,CHARINDEX(@delimiter,@input_string)+2,LEN(@input_string))
END
INSERT @values_table
SELECT @input_string
DECLARE @row_counter INT = 1
WHILE @row_counter <= (SELECT COUNT(*) FROM @values_table)
BEGIN
SET @output_string = @output_string + (
SELECT
string_values
FROM (
SELECT
string_values
,ROW_NUMBER() OVER (ORDER BY string_values) AS row_num
FROM @values_table) sub_query
WHERE row_num = @row_counter) + @delimiter
SET @row_counter = @row_counter + 1
END
SET @output_string = SUBSTRING(@output_string,0,LEN(@output_string)-2)
RETURN @output_string
END