Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie pierwszych 30 wyrazów
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
czachor
Witam!
Chcę pobrać z pola pierwszych 30 wyrazów i dodać na końcu kropki... W MySQL'u robiłem tak:
  1. SELECT CONCAT(SUBSTRING_INDEX(pole, ' ', 30), '...') AS dane FROM...

Przerzuciłem manual postgresa, pogooglowałem, próbowałem coś samemu stworzyć... ale jakoś nic sensownego mi nie wychodzi... Najbliższe rozwiązanie to użycie SUBSTR, ale to może mi np. pobrać pierwszych 300 znaków, nie patrząc, czy zakończy na spacji (wyrazie)...
Mogę to oczywiście zrobić w php, ale może jest to możliwe na poziomie bazy danych...

Z góry dzięki za wszelką pomoc!

PS. Prawdopodobnie da się to zrobić przy pomocy odpowiedniego wyrażenia regularnego w SUBSTR('ble ble ble itd', 'tu_wyrazenie'), ale specjalnie też mi nie wychodzi sad.gif

----UPDATE
Mam zapytanie, ale dziwnie działające...
  1. SELECT substr(pole, 0, strpos(pole, split_part(pole, ' ', 5))) || '...' AS dane

3 parametr w split_part() to kolejna spacja, do której ciąg jest obcinany...

I teraz... Różnie to działa blink.gif Czasami mi obcina dobrze (czyli 4 wyrazy + '...'), a czasami dostaję nie wiadomo dlaczego tylko pierwszych kilka liter blink.gif Wie ktoś może, o co tu do cięzkiej .... chodzi?? axesmiley.png Czy ja czegoś nie rozumiem, czy gdzieś indziej jest coś nie tak...
Powinno IMHO być wszystko tak jak trzeba, przesiedziałem kupę czasu z manualem/googlami, żeby sprawdzić, czy może robię coś nie tak... Znalazłem tylko coś o bugu(?) w split_part, ale nie rozumiem tam ostatniego postu (wyjaśnienia?)...

Dzięki za każde wieści na ten temat...
pozdr.
MStaniszczak
Witam

Oto funkcja w PLpq/SQL-u:

  1. CREATE OR REPLACE FUNCTION xwyrazow(integer, text) RETURNS text AS '
  2. DECLARE
  3. input_count ALIAS FOR $1;
  4. input_text ALIAS FOR $2;
  5.  
  6. itext TEXT;
  7. tmp INTEGER;
  8. ret TEXT;
  9. BEGIN ret := '''';
  10. itext := input_text;
  11. FOR i IN 1..input_count LOOP
  12. SELECT strpos(itext, '' '')
  13. INTO tmp; ret := ret||substr(itext, 0, tmp)||'' '';
  14. itext := substr(itext, tmp+1);
  15. END LOOP;
  16.  
  17. RETURN ret;
  18. END;
  19. ' LANGUAGE plpgsql;


wywołujesz tak:

  1. SELECT xwyrazow(3, pole)
  2. FROM tabela;


Napisana na poczekaniu - da się dopieścić;-)

I pomyśl dlaczego nie działa Twój przykład z części UPDATE - jak się nie domyślisz to Ci powiem ;-p

Pozdrawiam
Marcin Staniszczak
czachor
MStaniszczak - wielkie dzięki! Działa tak jak trzeba! guitar.gif
BTW mojego update'a... Przyznaję się bez bicia, że nie mogę rozpracować... Albo czegoś nie doczytałem... Z góry dzięki za wyjaśnienie smile.gif

pozdr.
MStaniszczak
Cytat
  1. SELECT substr(pole, 0, strpos(pole, split_part(pole, ' ', 5))) || '...' AS dane


Więc podpowiedź - co zwraca split_part(pole, ' ', 5)? Podpowiem (żebyś nie musiał szukać) - znak po 5 spacji.

Teraz co będzie jak tekst będzie wyglądał tak:

"Jedzie Jadwiga Jasną Jaskinią Jeden Jedyny Jasny Dzień."

?

Pozdrawiam
Marcin Staniszczak
czachor
Hehehe wtedy będzie porażka smile.gif
No i wszystko jasne...
Dzięki jeszcze raz za pomoc!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.