分裂&在sql server中重新排序字符串函数

时间:2014-10-07 07:40:27

标签: sql sql-server

如何在sql server中创建函数来拆分字符串
按空格划分并重新排序 name reFormat(myinput)
而myinput是mycolumn name
注意:
“[]”应该被删除,“ - ”应该用新订单连接新输出而不是空格(将第三组移动到开头)
例如:
myinput:[1A] 1B 1C 1D
输出:1C_1A_1B_1D


从mytable中选择myinput
[1A] 1B 1C 1D


从mytable中选择reFormat(myinput) 1C_1A_1B_1D

2 个答案:

答案 0 :(得分:1)

你需要这样的东西:

CREATE FUNCTION [dbo].[reFormat]
(
    @inText varchar(max)
)
RETURNS VARCHAR(255)
AS
BEGIN
    DECLARE @outText VARCHAR(255);

    DECLARE @node VARCHAR(100)
    DECLARE @node3 VARCHAR(100)
    DECLARE @pos INT
    DECLARE @count INT;
    SET @count = 1;
    DECLARE @space CHAR(1) = '_'

    WHILE CHARINDEX(' ', @inText) > 0
     BEGIN
      SELECT @pos  = CHARINDEX(' ', @inText)
      SELECT @node = REPLACE(REPLACE(SUBSTRING(@inText, 1, @pos-1), '[',''), ']','');


      IF @count = 3
        BEGIN
            SET @node3 = @node;
        END    
      ELSE 
        BEGIN
            SET @outText = CONCAT(@outText, @space + @node);
        END    
      SET @count = @count + 1;

      SELECT @inText = SUBSTRING(@inText, @pos+1, LEN(@inText)-@pos)
     END
     SELECT @node = REPLACE(REPLACE(@inText, '[',''), ']',''); 
     SET @outText = CONCAT(@node3, @outText) + @space + @node;

    RETURN @outText;

END

使用它的代码:

CREATE TABLE #MyTable 
(myinput varchar(255));
INSERT INTO #MyTable ( myinput ) VALUES  ( '[1A] 1B 1C 1D');

select dbo.reFormat(myinput) from #MyTable

DROP TABLE #MyTable;

答案 1 :(得分:0)

select @var = @var+data+'_' from (SELECT TOP 1 data
FROM  (SELECT Row_number()
               OVER (
                 ORDER BY data) id,
          data
       FROM   (SELECT Replace(Replace(Split.a.value('.', 'VARCHAR(100)'), '[', ''), ']', '') data
               FROM   (SELECT Cast ('<M>'
                                    + Replace('[1A] 1B 1C 1D', ' ', '</M><M>')
                                    + '</M>' AS XML) AS Data) AS A
                      CROSS APPLY Data.nodes ('/M') AS Split(a)) b) c
WHERE  id = 3
UNION all
SELECT data
FROM  (SELECT Row_number()
                OVER (
                  ORDER BY data) id,
              data
       FROM   (SELECT Replace(Replace(Split.a.value('.', 'VARCHAR(100)'), '[', ''), ']', '') data
               FROM   (SELECT Cast ('<M>'
                                    + Replace('[1A] 1B 1C 1D', ' ', '</M><M>')
                                    + '</M>' AS XML) AS Data) AS A
                      CROSS APPLY Data.nodes ('/M') AS Split(a)) b) c
WHERE  id != 3 
SELECT SUBSTRING(@var , 1, LEN(@var)-1)