Wyciągnięcie poszczególnych części

0

Cześć,
zwracam się z problemem i prośbą o pomoc.

BLOCZW102/70_WD15

Chciałbym wciągnąć do osobnych kolumn 120 i 70. Zarówno przed '/' jak i po długość znaków może się różnić.
Założyłem kiedyś wątek o podobnym problemie lecz nie potrafię przekształcić składni.
Wyciągnięcie poszczególnych części wymiarów

Kiedyś użytkownicy forum pomogli mi w taki sposób:
,REVERSE(PARSENAME(REPLACE(REVERSE(txt), '/', '.'), 1)) AS [x]
,REVERSE(PARSENAME(REPLACE(REVERSE(txt), '/', '.'), 2)) AS [y]

4

No dobra zanim przejdę do gotowców spróbuję Cię nieco zmusić do pracy.

Twoim elementem stałym jest wartość numeryczna potem '/' i znowu wartość numeryczna. Ja bym to na ten moment zrobił używają funkcji substring
https://docs.microsoft.com/en-us/sql/t-sql/functions/substring-transact-sql?view=sql-server-ver15
oraz
https://docs.microsoft.com/en-us/sql/t-sql/functions/patindex-transact-sql?view=sql-server-ver15

patindex wyszukujesz [0-9][0-9]

to taka podpowiedź nr 1
podpowiedź nr 2
to select substring(...) col1, substring(...) col2 aby uzyskać dwie kolumny

0

Ehh, niestety nie za bardzo rozumiem.

select SUBSTRING('BLOCZW102/70_WD15',PATINDEX('%[0-9]%','BLOCZW102/70_WD15'),PATINDEX('%[0-9]%','BLOCZW102/70_WD15')-2) col1, 
SUBSTRING('BLOCZW102/70_WD15',PATINDEX('%[0-9]%','BLOCZW102/70_WD15'),PATINDEX('%[0-9]%','BLOCZW102/70_WD15')+0) col2

Wykorzystałem to w taki sposób i zwraca mi różne wartości w zależności od tego, jaką wartość dam na końcu substringa a chyba nie o to chodziło.

2

No dobra to jeszcze raz ... musisz znaleźć 3 rzeczy za pomocą patindex

  1. samo LICZBA/LICZBA i to się robi prosto patindex('%[0-9]/[0-9]%',str) i to ci zwróci wartość 9
  2. Teraz musisz znaleźć wartość liczbową od 0 do 9 (a lepiej używając reverse od tego 8 znaku do 1) eliminując wszystkie znaki różne od 0-9 czyli '[^ 0-9]' - to ci da pozycję 7 i robisz zwykły substring od pozycji 7 do 9
  3. Robisz to co w punkcie 2 tyle, że od 9 znaku do pierwszego znaku, który liczbą nie jest :)

Mała podpowiedź:
http://sqlfiddle.com/#!18/b8206a/35

0

Niestety nie wiem, jak znaleźć dalszą część czyli liczbę po '/', co w przykładzie musiałbym zmienić?

2

Wystarczy przyjrzeć się i postarać się zrozumieć to co Ci podałem w przykładzie. Rozbiłem to nawet na kolumny by było widać co z czego wynika ... ale skoro już chcesz gotowca to proszę:
http://sqlfiddle.com/#!18/b8206a/47

0

Chcę to szybko zrobić i potem sobie na spokojnie przeanalizuję, tak czy siak będę musiał, aby to zrozumieć :)

Co z przypadkiem, gdy w liczbie jest przecinek?
np. BLOCZW102,5/0,07_WD15

Wtedy szuka tylko do przecinka

0

zasadniczo zmieniasz pattern na coś takiego [0-9],[0-9]/[0-9],[0-9] choć trochę trzeba będzie pokombinować

1

Ech ... uwierz mi, że jeśli planujesz karierę w IT gdzie będą bazy danych to robisz sobie krzywdę ale na potrzeby studiów ... pomogę bo sam korzystałem z 4p na studiach

http://sqlfiddle.com/#!18/c55548/21

Dodam tylko, że w TSQL dałoby się to napisać prościej i bardziej przejrzyście, a gdyby użyć do tego regexpa przy pomocy CLR:
https://docs.microsoft.com/pl-pl/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration
z C# to już w zasadzie jednym prostym patternem by się to załatwiło

gdyby sqlfiddle zdechło:

SELECT AlphabeticNum,
       case when patindex('%[0-9]/[0-9]%',AlphabeticNum) = 0 then null else
       substring(AlphabeticNum,
         patindex('%[0-9]/[0-9]%',AlphabeticNum) -
         (patindex('%[^ 0-9,0-9]%',reverse(substring(AlphabeticNum,1,patindex('%[0-9]/[0-9]%',AlphabeticNum)))) -1) + 1,
       abs((patindex('%[^ 0-9,0-9]%',reverse(substring(AlphabeticNum,1,patindex('%[0-9]/[0-9]%',AlphabeticNum)))) -1)))
       end leftready,
       case when patindex('%[0-9]/[0-9]%',AlphabeticNum) = 0 then null else
         substring(AlphabeticNum,patindex('%[0-9]/[0-9]%',AlphabeticNum)+2,
         abs(
           case when patindex('%[^ 0-9,0-9]%',substring(AlphabeticNum,patindex('%[0-9]/[0-9]%',AlphabeticNum)+2,len(AlphabeticNum))) -1 = -1 then
             len(AlphabeticNum) 
           else
             patindex('%[^ 0-9,0-9]%',substring(AlphabeticNum,patindex('%[0-9]/[0-9]%',AlphabeticNum)+2,len(AlphabeticNum))) -1 
           end 
         ))
       end rightready
 from alphanumreg
0

Jasne, dzięki wielkie za pomoc :)

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