Jak parsować string z datą, numerem klienta i zamówieniem?

Jak parsować string z datą, numerem klienta i zamówieniem?
Klaudia Z
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Cześć,
W swojej tabeli z klientami mam kolumnę comments która przechowuje wszystkie komentarze z profilu klienta.
Komentarz który chce wyciągnąć wygląda tak yyyy-mm-dd_numerklienta_zamowienie. Potrzebuje wyciągnąć wszystkie takie komentarze i najlepiej żeby każdy był w nowej komórce

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
0

trochę mało szczegółów. Trzymasz wszystkie komentarze per klient w jednym stringu? Sorry, ale tak to zrozumiałem

Klaudia Z
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Wszystkie komentarze per klient są w jednym polu tekstowym, wpisane jeden pod drugim, oddzielone enterem

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1135
0

@Klaudia Z Możesz czy nie możesz zmienić w kodzie, po stronie programu, gdzie i jak będą zapisywane dalsze rekordy?

Klaudia Z
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Nie mogę

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
0
Klaudia Z napisał(a):

Cześć,
W swojej tabeli z klientami mam kolumnę comments która przechowuje wszystkie komentarze z profilu klienta.
Komentarz który chce wyciągnąć wygląda tak yyyy-mm-dd_numerklienta_zamowienie. Potrzebuje wyciągnąć wszystkie takie komentarze i najlepiej żeby każdy był w nowej komórce

To jest zly projekt

Klaudia Z
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Tzn?

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
0

Że wiele danych upchane w jedną kolumnę. Elementarz

Klaudia Z
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Zgadzam się ale nie ja tworzyłam tą tabele i jest to jedyne miejsce gdzie te komentarze są przechowywane

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1135
0

@Klaudia Z Skoro trzeba to rozdzielić to i tak nowa tabelę IMO musisz zrobić. Więc dodanie/zmienienie funkcji zapisujacej po stronie aplikacji to tylko formalność

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
3
Klaudia Z napisał(a):

Zgadzam się ale nie ja tworzyłam tą tabele i jest to jedyne miejsce gdzie te komentarze są przechowywane

Kopiuj
SELECT c[1] as order_date,
       c[2] as client_number,
       c[3] as order_number
FROM (
  SELECT regexp_matches(comments, '([0-9]{4}-[0-9]{2}-[0-9]{2})_([a-z0-9]+)_([a-z0-9]+)') as c
  FROM clients
) as d;

Wynik:
screenshot-20240125132954.png

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1135
3

@Riddle Też o tym myślałem, ale chyba bym poszedł w stronę strings_to_array skoro i tak wiadomo czym jest przedzielone. Regex to kolejny problem do utrzymania :P

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
2

@Dregorio @AnyKtokolwiek : ja pierd**** pytacz pyta jak stringa sparsować a wy mu proponujecie przepisanie systemu. Jeszcze o moc zasilacza zapytajcie i na koniec stwierdźcie, że wątek do zamknięcia bo zasilacz za słaby... Jakbym elektrodę przeglądał (i to wcale nie jest komplement)

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
0
Dregorio napisał(a):

@Riddle Też o tym myślałem, ale chyba bym poszedł w stronę strings_to_array skoro i tak wiadomo czym jest przedzielone. Regex to kolejny problem do utrzymania :P

Separatory się powtarzają.

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1135
0

@Riddle No tak i dlatego nie widzę sensu w regex

@abrakadaber ok, może trochę nadinterpretowałem ostatnie zdania OP. W sumie, w mojej głowie było, że potem zapisać od razu gdzieś, a nie że zwrócić do aplikacji.

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1135
0

@Riddle https://www.db-fiddle.com/f/8F3dv2YFdrmko7KZjH5zXQ/0 wiesz jak się na telefonie paskudnie pisze takie rzeczy?

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
0
Dregorio napisał(a):

@Riddle Też o tym myślałem, ale chyba bym poszedł w stronę strings_to_array skoro i tak wiadomo czym jest przedzielone. Regex to kolejny problem do utrzymania :P

Nie tylko utrzymaniówka, ale zwykły koszt na procesorze / procesorach.
Przejściowo jeden ze znajomych serwerów był w biurze, i słychać było po wentylatorach, kiedy baza dostawała procesorowo w d...
Bo "my" chyba tak normalnie nie za bardzo o tym myślimy

Gdybym miał szukać, bym szukał jakimś rodzajem indexof i substring (nie mam dowodów - intuicja)

Klaudia Z napisał(a):

Zgadzam się ale nie ja tworzyłam tą tabele i jest to jedyne miejsce gdzie te komentarze są przechowywane

Komentarze do zlecenia przy clients ... piekne.
Jak sobie "wymysliciel" tej bazy poradził z krotnosciami

Dregorio napisał(a):

@Klaudia Z Skoro trzeba to rozdzielić to i tak nowa tabelę IMO musisz zrobić. Więc dodanie/zmienienie funkcji zapisujacej po stronie aplikacji to tylko formalność

To nieuniknione zawalczyć o zmianę, zwłaszcza, że to niejedyny problem.

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
0
AnyKtokolwiek napisał(a):

Nie tylko utrzymaniówka, ale zwykły koszt na procesorze / procesorach.
Przejściowo jeden ze znajomych serwerów był w biurze, i słychać było po wentylatorach, kiedy baza dostawała procesorowo w d...

Mikrooptymalizacja. Pokaż w profilerze albo innym narzędziu faktyczną różnicę między takim regexpem a string_to_array() i podaj liczbę na ilu recordach widać różnicę (obstawiam milisekundy przy milionach wierszy, może), już nie mówiąc o tym że przy którymś użyciu postgres sobie zapisze skompilowanego regexpa i przejedzie go optymalizatorem.

YA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2384
4

Rozbudowując przykład @Dregorio

https://www.db-fiddle.com/f/2HWXadZEhbrP6btdXAuJC4/0

Kopiuj
create table clients (
  id text,
  comments TEXT
 );
 
 insert into clients values('id1','foo\nbar\n2024-01-16_id1_zamowienie1\ninny_komentarz\n2024-01-17_id1_zamowienie2\n2024-01-18_id1_zamowienie3');
 insert into clients values('id2','foo\nbar\n2023-01-16_id2_zamowienie2\ninny_komentarz\n2023-01-17_id2_zamowienie2\n2023-01-18_id2_zamowienie3');

WITH unnested_data AS (
    SELECT id,unnest(string_to_array(comments, '\n')) AS comment FROM clients
)
SELECT
  id,comment
FROM
  unnested_data
WHERE
  comment ~ '^\d{4}-\d{2}-\d{2}_[^_]+_[^_]+$';
  
  

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.