Wybranie konkretnych znaków z pola.

Wybranie konkretnych znaków z pola.
CI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 44
0

Witam,
Poproszę Was o pomoc jak optymalnie wybrać Fragment tekstu z pola.
Pole w tabeli ma postać:
Produkcja 319863
Rozbiór 320149
Produkcja 319863-RWP MMP/347/18
Rozbiór 320149-PW MMP/98/18
Produkcja 320742-RWP MMP/470/18
Rozbiór 320854-PW MMP/172/18

Budowa jest stała:
Nazwa NUMER ZLECENIA-Dokument
Nazwa NUMER ZLECENIA
Chciałbym "wybrać" Numer zlecenia np: 319863 (reszta jest zbędna).
Numer zlecenia jest przyrostowy jak przekroczymy od 1 do ....
Dopisek: -RWP MMP/347/18 - jest zmienny w każdym zakresie, zawiera (Typ dokumenty, magazyn, Numer, Rok)

Tak się zastanawiam....
Czy "PATINDEX" da się jakoś wykorzystać?

CI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 44
0

Zrobiłem coś takiego:

Kopiuj
SELECT Adres, 
       PATINDEX('%[0-9]%',Adres) as KodStart,
       LEN(Adres)+1 AS Dlugosc,
       PATINDEX('%-%',Adres) as Kodkoniec,
       CASE
       WHEN PATINDEX('%-%',Adres) = 0 THEN RIGHT(Adres,LEN(Adres)+1 -PATINDEX('%[0-9]%',Adres))
       ELSE SUBSTRING(Adres,PATINDEX('%[0-9]%',Adres), PATINDEX('%-%',Adres)-PATINDEX('%[0-9]%',Adres)) END


       -- SUBSTRING(Adres,PATINDEX('%[0-9]%',Adres), PATINDEX('%-%',Adres)- PATINDEX('%[0-9]%',Adres) ) as KodPocztowy
FROM
(
    -- potraktuj to jak regularną tabelę ;)
    SELECT 'Rozbiór 320984-PW MMP/170/18' as Adres 
    UNION
    SELECT 'Produkcja 32090-RWP MMP/477/18'
    UNION 
    SELECT 'Rozbiór 320149-PW MMP/98/18' 
    UNION 
    SELECT 'Rozbiór 3191234' 
) as Adresy

Można to zrobić "prościej"?

  • Rejestracja: dni
  • Ostatnio: dni
0

Pomoże Ktoś?

endrius
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 101
0

STRING_SPLIT ?

CI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 44
0
endrius napisał(a):

STRING_SPLIT ?

Do raportowania mam serwer 2012, który współpracuje z bazą na serwerze 2008.
Ta funkcja jest w wersji 2016.
Koszt podniesienia do 2016... przy 150 końcówkach :-).

endrius
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 101
0

No to SUBSTRING

  • Rejestracja: dni
  • Ostatnio: dni
0

Można by użyć CHARINDEX zamiast PATINDEX, chyba byłoby szybsze.
SUBSTRING(Adres, CHARINDEX(' ', Adres), CASE WHEN CHARINDEX('-', Adres) > 0 THEN CHARINDEX('-', Adres) - CHARINDEX(' ', Adres) ELSE 99 END),

CI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 44
0
Krzywy Ogrodnik napisał(a):

Można by użyć CHARINDEX zamiast PATINDEX, chyba byłoby szybsze.
SUBSTRING(Adres, CHARINDEX(' ', Adres), CASE WHEN CHARINDEX('-', Adres) > 0 THEN CHARINDEX('-', Adres) - CHARINDEX(' ', Adres) ELSE 99 END),

Dzięki,
Wrzuciłem na test w domu i wygląda super.
Zasada działanie podobna ale zapytanie bardziej miłe dla "Oka". Jutro przetestuję w robocie na bazie.
Chociaż zasada działania podobna :-)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.