Tworzenie rekordu na podstawie atrybutu

Odpowiedz Nowy wątek
2018-03-13 16:49
Fullkowsky
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.

Pozostało 580 znaków

2018-03-13 17:00
0

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

Pozostało 580 znaków

2018-03-13 17:04
Fullkowsky
0

Mssql
CiągZnakowA/B/C

Pozostało 580 znaków

2018-03-13 17:05
0

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

Pozostało 580 znaków

2018-03-13 17:16
Fullkowsky
0

14.
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

Pozostało 580 znaków

2018-03-13 21:17
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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