Tworzenie rekordu na podstawie atrybutu

0

Witam,
Potrzebuję porady, mianowicie jak tworzyć nowe wiersze na podstawie atrybutu wpisanego we wcześniejszych rekordach.
Wyjaśniam.
CiągZnakow1; CiągZnakow2; CiągZnakow3; CiągZnakowA/B/C
CiągZnakow4; CiągZnakow5; CiągZnakow6; CiągZnakowA/C
Potrzebuję wyniku:
CiągZnakow1; CiągZnakow2; CiągZnakow3; CiągZnakowA
CiągZnakow1; CiągZnakow2; CiągZnakow3; CiągZnakowB
CiągZnakow1; CiągZnakow2; CiągZnakow3 ; CiągZnakowC
CiągZnakow4; CiągZnakow5; CiągZnakow6; CiągZnakowA
CiągZnakow4; CiągZnakow5; CiągZnakow6; CiągZnakowC

Czy macie jakiś pomysł? Aż tak biegły nie jestem.
Dzięki za wszystkie rady.

0

Jaki silnik/baza?
CiągZnakowA/B/C to faktycznie taki czy: CiągZnakowA/CiągZnakowB/CiągZnakowC

0

Mssql
CiągZnakowA/B/C

0

Która wersja ms?
skąd wiesz jak długi jest CiagZnakow i jak rozbić je na A B C?

0

Niestety ciągiZnakow nie mają takiej samej ilości znaków. Bardziej interesuje mnie rozbijanie po znakach, przykłady:
/
_
;
,

Przejrzystrzy przykład:
ul. Jasna 2A-C
ul. Orla 3 B/D
wynik
ul. Jasna 2A
ul. Jasna 2C
ul. Orla 3B
ul. Orla 3D

0

Jeżeli przyjmiemy kilka założeń:

  1. Zamienimy wszystkie znaki po których chcesz rozdzielać na jeden np '/', tzn:

że wartości będą wyglądać tak

źródłowa docelowa
ul. Jasna 2A-C ul. Jasna 2A/C
ul. Orla 3 B/D ul. Orla 3 B/D
ul. Beznumeru ul. Beznumeru
ul. Kwiatowa 1;2; 3; 4 ul. Kwiatowa 1/2/ 3/ 4

Przyjmiemy że ciagznakow ma długość: pozycja pierwszego / - 1

czyli dla dla ul. Jasna 2A/C: 13-1=12 = ul. Jasna 2

Wartości do rozdzielenia to wszystko od pozycje pierwszego / -1 czyli dla ul. Jasna 2A/C = A/C

To możemy użyć funkcji SPLIT_STRING:

WITH cte AS (
SELECT 
    kol1
    ,Charindex('/', kol) CI --pozycha pierwszego wystąpienia /
    ,kol --kolumna z zamienionymi znakami -;,_ na /
FROM (SELECT
        kol1
        ,Replace(
			Replace(
				Replace(
					Replace(kol1, '-', '/')
				, ';','/'), 
            ',','/')
		,'_','/') kol 
      FROM
		t1
	) AS DT
) 
SELECT kol1, 
       CASE WHEN ci>0 THEN LEFT(kol, ci-2) ELSE '' END + value 
FROM   cte 
       CROSS APPLY String_split(Substring(kol, ci - 1, 100), '/') 

http://sqlfiddle.com/#!18/13023/17

1 użytkowników online, w tym zalogowanych: 0, gości: 1