2017-11-17 4 views
1

Wie konvertiert man [0,3,4] in 100110 das 6-stellige String-Format in SQL Server 2012?Wie konvertiert man [0,3,4] in 100110, das 6-stellige Zeichenfolgenformat in SQL Server 2012 ist?

Beispiel

string [2,4,5] 

sollte in

string 001011 

I 6-stellige Zeichenfolge machen müssen, umgewandelt werden und die Ziffer oder Position in der Zeichenfolge 000000 sollte auf 1 annehmen, in oben Zeichenfolge werden umwandeln [ 2,4,5] bedeutet, dass der 2., 4. und 5. Index von 000000 in 1 konvertiert werden soll. Die letzte Zeichenkette sollte 001011

enter image description here

0 sein
+2

Was ist die Logik unter Umwandlung '[0,3,4]' 'in 100110'? Bitte? fügen Sie einige Details hinzu. – gofr1

+0

@ gofr1 - Frage mit Erläuterung bearbeitet – KulOmkar

+0

Danke! Noch eine Frage. Wie ist diese Zeichenfolge gespeichert? Nur eine 'varchar'-Spalte mit' [0,3,4] '? – gofr1

Antwort

2
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]') 
-- convert array to xml 
;WITH cte AS (
    SELECT [value], 
      CAST('<a>'+REPLACE(SUBSTRING([value],2,LEN([value]) - 2),',','</a><a>')+'</a>' as xml) as x 
    FROM @yourTable 
) 
-- do the stuff 
SELECT 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.[value] 

Ausgang:

value (No column name) 
[0,3,4] 100110 
[2,4,5] 001011 

Erläuterung:

STUFF(@zero_str,t.c.value('.','tinyint')+1,1,'1') Dieser einen Teil 000000-1 ändert, nach diesem Teil haben wir:

[2,4,5] 001000 
[2,4,5] 000010 
[2,4,5] 000001 
[0,3,4] 100000 
[0,3,4] 000100 
[0,3,4] 000010 

In der Tabelle. Dann machen wir CASTing zu int? so können wir SUM verwenden, nachdem diese Daten aussehen wird:

[0,3,4] 100110 
[2,4,5] 1011 

Dann fügen wir 000000 String und verwenden RECHTS nur 6 Symbole zu erhalten.

Hoffe, dass hilft!

Hinweis:

Wenn keine ids in einer Tabelle dann ROW_NUMBER in CTE Teil verwenden.

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] 

Ausgang:

rn value (No column name) 
2 [0,3,4] 100110 
5 [0,3,4] 100110 
3 [2,3,4] 001110 
6 [2,3,4] 001110 
1 [2,4,5] 001011 
4 [2,4,5] 001011 
+0

Ja Ihre Antwort funktioniert, ich habe ein Problem, wenn in der Tabelle dieselben Werte vorhanden sind, oder zweimal angenommen [2,3,4], dann kommt die Antwort wie 022200 – KulOmkar

+0

Ich verstehe. Es gibt keine IDs in einer Tabelle? – gofr1

+1

Wenn keine IDs - dann ROW_NUMBER, siehe Hinweis zu meiner Antwort. Wenn IDs - fügen Sie sie zum CTE-Teil und in GROUP BY-Teil hinzu – gofr1

3

Sie PARSENAME() Funktion könnten versuchen, beginnt SQL Server 2012

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 

Ergebnis:

Original String Converted String 
[0, 3, 4]   100110 
[1, 3, 4]   010110 

Sie Parsename() Funktion erfahren könnte .. https://docs.microsoft.com/en-us/sql/t-sql/functions/parsename-transact-sql

+0

Wie es in dynamischer Weise getan wird – KulOmkar

+0

@KulOmkar versuchen, bearbeitet. –

Verwandte Themen