如何在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
答案 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)