Sql server 在SQL Server 2012中,如何将[0,3,4]转换为6位字符串格式的100110?
在SQL Server 2012中,如何将[0,3,4]转换为6位字符串格式的100110 范例Sql server 在SQL Server 2012中,如何将[0,3,4]转换为6位字符串格式的100110?,sql-server,format,Sql Server,Format,在SQL Server 2012中,如何将[0,3,4]转换为6位字符串格式的100110 范例 string [2,4,5] 应转换为 string 001011 我必须生成6位字符串,并且字符串000000中的数字或位置应转换为1,假设在上面的字符串[2,4,5]中,表示000000的第2、第4和第5个索引应转换为1。最后一个字符串应该是001011 您可以尝试PARSENAME()函数从SQLServer2012 DECLARE @DATA1 VARCHAR(6) = '00000
string [2,4,5]
应转换为
string 001011
我必须生成6位字符串,并且字符串000000中的数字或位置应转换为1,假设在上面的字符串[2,4,5]中,表示000000的第2、第4和第5个索引应转换为1。最后一个字符串应该是001011
您可以尝试
PARSENAME()
函数从SQLServer2012
DECLARE @DATA1 VARCHAR(6) = '000000'
SELECT A.DATA [Original String],
STUFF(STUFF(STUFF(@DATA1, [First]+1, 1, '1'), [Second]+1 , 1, '1'), [Third]+1, 1, '1') [Converted String] FROM
(
SELECT DATA, PARSENAME(REPLACE(REPLACE(REPLACE(DATA, '[', ''), ']',''), ',', '.'),3) [First], PARSENAME(REPLACE(REPLACE(REPLACE(DATA, '[', ''), ']',''), ',', '.'),2) [Second], PARSENAME(REPLACE(REPLACE(REPLACE(DATA, '[', ''), ']',''), ',', '.'),1) [Third] FROM <table_name>
) A
您可以学习
Parsename()
函数 您可以尝试PARSENAME()
函数从SQLServer2012开始
DECLARE @DATA1 VARCHAR(6) = '000000'
SELECT A.DATA [Original String],
STUFF(STUFF(STUFF(@DATA1, [First]+1, 1, '1'), [Second]+1 , 1, '1'), [Third]+1, 1, '1') [Converted String] FROM
(
SELECT DATA, PARSENAME(REPLACE(REPLACE(REPLACE(DATA, '[', ''), ']',''), ',', '.'),3) [First], PARSENAME(REPLACE(REPLACE(REPLACE(DATA, '[', ''), ']',''), ',', '.'),2) [Second], PARSENAME(REPLACE(REPLACE(REPLACE(DATA, '[', ''), ']',''), ',', '.'),1) [Third] FROM <table_name>
) A
您可以学习Parsename()
函数
说明:
STUFF(@zero_str,t.c.value('.','tinyint')+1,1,'1')
这将000000
的某些部分更改为1
,在这部分之后我们将有:
[2,4,5] 001000
[2,4,5] 000010
[2,4,5] 000001
[0,3,4] 100000
[0,3,4] 000100
[0,3,4] 000010
在桌子上。然后我们对int
?因此,我们可以使用SUM
,在此数据之后如下所示:
[0,3,4] 100110
[2,4,5] 1011
然后我们添加000000
字符串,并使用RIGHT仅获取6个符号
希望有帮助
注意:
如果表中没有id,则使用CTE部件中的行号
DECLARE @zero_str VARCHAR(6) = '000000'
-- Generate table alike to yours
DECLARE @yourTable TABLE (
[value] varchar(max)
)
INSERT INTO @yourTable VALUES ('[2,4,5]'),('[0,3,4]'),('[2,3,4]'),('[2,4,5]'),('[0,3,4]'),('[2,3,4]')
-- convert array to xml
;WITH cte AS (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as rn,
[value],
CAST('<a>'+REPLACE(SUBSTRING([value],2,LEN([value]) - 2),',','</a><a>')+'</a>' as xml) as x
FROM @yourTable
)
-- do the stuff
SELECT c.rn,
c.[value],
RIGHT(@zero_str + CAST(SUM(CAST(STUFF(@zero_str,t.c.value('.','tinyint')+1,1,'1') as int)) as varchar(6)),6 )
FROM cte c
CROSS APPLY x.nodes('/a') as t(c)
GROUP BY c.rn, c.[value]
说明:
STUFF(@zero_str,t.c.value('.','tinyint')+1,1,'1')
这将000000
的某些部分更改为1
,在这部分之后我们将有:
[2,4,5] 001000
[2,4,5] 000010
[2,4,5] 000001
[0,3,4] 100000
[0,3,4] 000100
[0,3,4] 000010
在桌子上。然后我们对int
?因此,我们可以使用SUM
,在此数据之后如下所示:
[0,3,4] 100110
[2,4,5] 1011
然后我们添加000000
字符串,并使用RIGHT仅获取6个符号
希望有帮助
注意:
如果表中没有id,则使用CTE部件中的行号
DECLARE @zero_str VARCHAR(6) = '000000'
-- Generate table alike to yours
DECLARE @yourTable TABLE (
[value] varchar(max)
)
INSERT INTO @yourTable VALUES ('[2,4,5]'),('[0,3,4]'),('[2,3,4]'),('[2,4,5]'),('[0,3,4]'),('[2,3,4]')
-- convert array to xml
;WITH cte AS (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as rn,
[value],
CAST('<a>'+REPLACE(SUBSTRING([value],2,LEN([value]) - 2),',','</a><a>')+'</a>' as xml) as x
FROM @yourTable
)
-- do the stuff
SELECT c.rn,
c.[value],
RIGHT(@zero_str + CAST(SUM(CAST(STUFF(@zero_str,t.c.value('.','tinyint')+1,1,'1') as int)) as varchar(6)),6 )
FROM cte c
CROSS APPLY x.nodes('/a') as t(c)
GROUP BY c.rn, c.[value]
将[0,3,4]
转换为100110
的逻辑是什么?请添加一些详细信息。@gofr1-问题已用解释编辑谢谢!还有一个问题。这个字符串是如何存储的?只需一个varchar
列,包含[0,3,4]
?@gofr1-旧字符串格式为varchar(max),我们可以在任何sql列格式中选择新值ike 100110,以及该字符串现在是如何存储的?你能在那列中添加一些数据样本吗?或者如何获取该字符串(如[2,4,5]
)?将[0,3,4]
转换为100110
的逻辑是什么?请添加一些详细信息。@gofr1-问题已用解释编辑谢谢!还有一个问题。这个字符串是如何存储的?只需一个varchar
列,包含[0,3,4]
?@gofr1-旧字符串格式为varchar(max),我们可以在任何sql列格式中选择新值ike 100110,以及该字符串现在是如何存储的?你能在那列中添加一些数据样本吗?或者你如何得到这个字符串(比如[2,4,5]
)?是的,你的答案是有效的,我面临一个问题,如果表中有相同的值,或者假设出现两次[2,3,4],那么答案就像022200我得到了你。表中没有任何ID?如果没有ID-那么行号,请参阅我的答案注释。如果ID-将它们添加到CTE零件中,并按零件分组是的,您的答案有效,如果表中有相同的值,或者出现两次[2,3,4],我将面临一个问题,假设出现两次[2,3,4],那么答案是022200,我明白了。表中没有任何ID?如果没有ID-那么行号,请参阅我的答案注释。如果ID-将其添加到CTE零件中并按零件分组