Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server 2012中,如何将[0,3,4]转换为6位字符串格式的100110?_Sql Server_Format - Fatal编程技术网

Sql server 在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

在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) = '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零件中并按零件分组