2014-12-12 2 views
5

Я новичок в SQL Server, а также в переполнении стека. Извините за мои ошибки.Как сортировать строку по алфавиту

Можно ли отсортировать значение в столбце в алфавитном порядке? Вот мой стол

NAME 
...... 
XZYVW 
EBACD 

Мой результат должен выглядеть ниже

NAME 
...... 
VWXYZ 
ABCDE 

Любая идея, чтобы получить это?

+1

Эта статья может помочь вам, http://www.techrepublic.com/blog/the-enterprise-cloud/sorting-character-strings-using-sql-server/ –

+0

Должен ли я написать функцию для этого? Нет ли встроенной функции, например, в .Net и все? @Daniel E. –

+1

@MohithKm: нет, вам либо нужно написать функцию t-sql самостоятельно, используя .NET-метод (вы также можете использовать .NET в SQL-Server] (http://msdn.microsoft.com /en-us/library/ms254498%28v=vs.110%29.aspx)) или реорганизовать проект вашей базы данных. Проще всего было бы сортировать на стороне клиента с .NET, где вы хотите его показать. –

ответ

0

Создать User Defined Scalar Function.

CREATE FUNCTION dbo.Alphaorder (@str VARCHAR(50)) 
returns VARCHAR(50) 
    BEGIN 
     DECLARE @len INT, 
       @cnt INT =1, 
       @str1 VARCHAR(50)='', 
       @output VARCHAR(50)='' 

     SELECT @len = Len(@str) 
     WHILE @cnt <= @len 
     BEGIN 
      SELECT @str1 += Substring(@str, @cnt, 1) + ',' 

      SET @cnt+=1 
     END 

     SELECT @str1 = LEFT(@str1, Len(@str1) - 1) 

     SELECT @output += Sp_data 
     FROM (SELECT Split.a.value('.', 'VARCHAR(100)') Sp_data 
      FROM (SELECT Cast ('<M>' + Replace(@str1, ',', '</M><M>') + '</M>' AS XML) AS Data) AS A 
        CROSS APPLY Data.nodes ('/M') AS Split(a)) A 
     ORDER BY Sp_data 

     RETURN @output 
    END 

Результат:

SELECT dbo.Alphaorder ('XZYVW') --VWXYZ 
3

Даже некоторые оптимизированные возможности существуют. Здесь две функции используют Bubble sort сортировать символ.

CREATE FUNCTION udf_SortString 
(
    @string VARCHAR(1000) 
) 
RETURNS VARCHAR(1000) 
AS 
BEGIN 
    DECLARE @len TINYINT 
    DECLARE @i TINYINT 
    DECLARE @currentchar CHAR(1) 
    DECLARE @swapped BIT 
    DECLARE @begin BIT 
    DECLARE @nextchar CHAR(1) 

    SET @begin = 1 
    SET @len = LEN(@string) 
    SET @i = 1 

    WHILE @begin = 1 OR @swapped = 1 
    BEGIN 
     SET @swapped = 0 
     SET @i = 1 
     SET @begin = 0 
     WHILE @i <= @len 
     BEGIN 
      SET @currentchar = SUBSTRING(@string, @i, 1) 
      SET @nextchar = SUBSTRING(@string, @i + 1, 1) 

      IF @currentchar > @nextchar AND (@nextchar > '') 
      BEGIN 
       SET @string = dbo.udf_swap(@string, @i, @i + 1) 
       SET @swapped = 1 
      END 

      SET @i = @i + 1 
     END 
    END 

    RETURN(@string) 
END 

Функция 2:

CREATE FUNCTION dbo.udf_Swap 
(
    @fullstring VARCHAR(1000), 
    @charlocation1 TINYINT, 
    @charlocation2 TINYINT 
) 
RETURNS VARCHAR(1000) 
AS 
BEGIN 
     DECLARE @returnval varchar(1000) 
     DECLARE @begin VARCHAR(1000), @middle VARCHAR(1000), @end VARCHAR(1000) 
     DECLARE @firstchar CHAR(1), @secondchar CHAR(1), @len INT 
     SET @fullstring = LTRIM(RTRIM(@fullstring)) 
     SET @len = LEN(@fullstring) 

    IF @charlocation1 > @len OR @charlocation2 > @len 
     SET @returnval = @fullstring 
     ELSE 
     BEGIN 
       SET @firstchar = SUBSTRING(@fullstring, @charlocation1, 1) 
       SET @secondchar = SUBSTRING(@fullstring, @charlocation2, 1) 
       SET @begin = LEFT(@fullstring, (@charlocation1-1)) 
       SET @middle = SUBSTRING(@fullstring, @charlocation1+1, (@[email protected])-1) 
       SET @end = SUBSTRING(@fullstring, @charlocation2+1, @len) 
       SET @returnval = @begin + @secondchar + @middle + @firstchar + @end 
     END 
    RETURN(@returnval) 
END 

Результат:

select dbo.udf_SortString('zxcvbfgrtyuijklm') 
--Returns bcfgijklmrtuvxyz 

--Reference

--Quick demo here

0

Это будет сортировать буквы алфавита без использования функции.

DECLARE @t table(col varchar(4000)) 
INSERT @t values('kdjfh'),('zug') 

;WITH t as 
(
    SELECT 0 v FROM (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) x(a) 
), u as 
(
    SELECT row_number() over(order by (select 1))p 
    FROM t CROSS JOIN t t2 CROSS JOIN t t3 CROSS JOIN t t4 
) 
SELECT col, 
    ( 
     SELECT substring(col,p,1) 
     FROM u 
     ORDER BY substring(col,p,1) 
     for xml path(''), type 
    ).value('.', 'varchar(max)') [SortedCol] 
FROM @t 

Результат:

col SortedCol 
kdjfh dfhjk 
zug guz