Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PostgreSQL 8.3] Rozmiar tablicy
phpion
post 26.05.2010, 07:52:26
Post #1





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Heja,
jak w PostgreSQL 8.3 odczytać rozmiar tablicy? W 8.4 mamy już funkcję array_length(), ale w 8.3 jej nie ma. Albo inaczej: mając ciąg:
Kod
a/b/c

chciałbym pobrać "poziom zagłębienia" czyli ilość elementów po rozdzieleniu po "/" (w tym przypadku 3). Przeglądałem funkcje na stringach, ale również nie znalazłem niczego pomocnego.

Pozdrawiam,
pion

// Edit:
Na razie napisałem sobie taką funkcję, może komuś się przyda:
  1. CREATE OR REPLACE FUNCTION f_array_length(_array anyarray)
  2. RETURNS integer AS
  3. $BODY$DECLARE
  4. length INTEGER;
  5. BEGIN
  6. length := 0;
  7.  
  8. FOR i IN COALESCE(ARRAY_LOWER(_array, 1), 0)..COALESCE(ARRAY_UPPER(_array, 1), -1) LOOP
  9. length := length + 1;
  10. END LOOP;
  11.  
  12. RETURN length;
  13. END;$BODY$
  14. LANGUAGE 'plpgsql' VOLATILE
  15. COST 100;

Olałem drugi parametr bo nie jest mi potrzebny.

Ten post edytował phpion 26.05.2010, 08:08:21
Go to the top of the page
+Quote Post
wookieb
post 26.05.2010, 08:29:19
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1. SELECT count(*) FROM regexp_split_to_table('a/b/c', '/')

Druga opcja
  1. SELECT REPLACE(split_part(array_dims(regexp_split_to_array('a/b/c', '/')),':',2),']','')::int

Ale twoje rozwiązanie też działa.

Ten post edytował wookieb 26.05.2010, 08:32:16


--------------------
Go to the top of the page
+Quote Post
phpion
post 26.05.2010, 08:36:06
Post #3





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Hmmm, a jak Twoje rozwiązanie sprawdzi się przy wybieraniu rekordów z tabeli oraz określaniu ich poziomu zagłębienia? W tabeli mam kolumnę name, a niej ciągi wpisane właśnie jako a/b/c i do każdego rekordu chciałbym dołączyć głębokość zagnieżdżenia.

W międzyczasie zobaczyłem, że edytowałeś swojego posta dopisując drugie rozwiązanie. Ono jest OK! Porównałem czasy wykonania Twojego, oraz mojego bazującego na własnej funkcji - Twoje jest 2x szybsze! Dzięki!

// Edit:
A to jest jeszcze szybsze:
  1. SELECT REPLACE(split_part(array_dims(string_to_array('a/b/c', '/')),':',2),']','')::int

Zmieniłem regexp_split_to_array na string_to_array i czas wykonania spadł o ~0.2 ms - zawsze to coś! smile.gif

Ten post edytował phpion 26.05.2010, 08:43:09
Go to the top of the page
+Quote Post
wookieb
post 26.05.2010, 08:51:30
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Pomijając już kwestię tablic, to parametr depth (czyli poziom zagłębienia) powinno się trzymać w dodatkowej kolumnie, ponieważ trochę bez sensu jest przeliczanie tego za każdym razem a uwierz mi, że parametr ten bardzo się przydaje.


--------------------
Go to the top of the page
+Quote Post
phpion
post 26.05.2010, 10:42:01
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




No u mnie akurat nie jest on często wykorzystywany (w zasadzie to tylko raz i to na dodatek w sekcji administracyjnej na niewielkiej liczbie danych ( > 100)). Rozważałem utworzenie nowego pola i aktualizacja jego wartości triggerem, ale byłoby to bez sensu, przerost formy nad treścią.
Go to the top of the page
+Quote Post
cojack
post 27.05.2010, 17:04:33
Post #6





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Imo dla mnie bezsensu jest tworzenie ścieżki na takich stylach, przecież możesz sobie ją trzymać w VARCHAR[] w postaci: '{a,b,c}' i nie masz problemu. W dodatku jest na prawdę dużo funkcji do pracy na tabliach i ideks GITS albo GIST nie chce mi się szukać w google a nie pamiętam teraz, może b.przyśpieszyć pracę na takich elementach.


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 09:44