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
Jak parsować string z datą, numerem klienta i zamówieniem?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 9
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Silesia/Marki
- Postów: 5550
trochę mało szczegółów. Trzymasz wszystkie komentarze per klient w jednym stringu? Sorry, ale tak to zrozumiałem
- Rejestracja: dni
- Ostatnio: dni
- Postów: 9
Wszystkie komentarze per klient są w jednym polu tekstowym, wpisane jeden pod drugim, oddzielone enterem
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1135
@Klaudia Z Możesz czy nie możesz zmienić w kodzie, po stronie programu, gdzie i jak będą zapisywane dalsze rekordy?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 3561
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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 3561
Że wiele danych upchane w jedną kolumnę. Elementarz
- Rejestracja: dni
- Ostatnio: dni
- Postów: 9
Zgadzam się ale nie ja tworzyłam tą tabele i jest to jedyne miejsce gdzie te komentarze są przechowywane
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1135
@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ść
- Rejestracja: dni
- Ostatnio: dni
- Postów: 10227
Klaudia Z napisał(a):
Zgadzam się ale nie ja tworzyłam tą tabele i jest to jedyne miejsce gdzie te komentarze są przechowywane
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:

- Rejestracja: dni
- Ostatnio: dni
- Postów: 6610
@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)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 10227
Dregorio napisał(a):
@Riddle Też o tym myślałem, ale chyba bym poszedł w stronę
strings_to_arrayskoro i tak wiadomo czym jest przedzielone. Regex to kolejny problem do utrzymania :P
Separatory się powtarzają.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1135
@Riddle https://www.db-fiddle.com/f/8F3dv2YFdrmko7KZjH5zXQ/0 wiesz jak się na telefonie paskudnie pisze takie rzeczy?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 3561
Dregorio napisał(a):
@Riddle Też o tym myślałem, ale chyba bym poszedł w stronę
strings_to_arrayskoro 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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 10227
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2384
Rozbudowując przykład @Dregorio
https://www.db-fiddle.com/f/2HWXadZEhbrP6btdXAuJC4/0
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}_[^_]+_[^_]+$';