sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL udává, kolikrát se podřetězec vyskytuje v textu

Vřele doporučuji prostudovat si tuto odpověď, kterou jsem zveřejnil na „Jak počítáte výskyty ukotveného řetězce pomocí PostgreSQL?“ . Ukázalo se, že vybraná odpověď je výrazně pomalejší než upravená verze regexp_replace() . Režie na vytváření řádků a provozování agregátu je prostě příliš vysoká.

Nejrychlejší způsob, jak to udělat, je následující...

SELECT
  (length(str) - length(replace(str, replacestr, '')) )::int
  / length(replacestr)
FROM ( VALUES
  ('foobarbaz', 'ba')
) AS t(str, replacestr);

Tady jsme

  1. Vezměte délku řetězce, L1
  2. Odečtěte od L1 délka řetězce se všemi odstraněnými náhradami L2 získat L3 rozdíl v délce řetězce.
  3. Rozdělte L3 podle délky nahrazení, abyste získali výskyty

Pro srovnání je to asi pětkrát rychlejší než metoda pomocí regexp_matches() který vypadá takto.

SELECT count(*)
FROM ( VALUES
  ('foobarbaz', 'ba')
) AS t(str, replacestr)
CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');


  1. Část 2 – Jak uspořádat velký databázový diagram

  2. Jak používat sql*plus v příkazovém skriptu Windows k řízení toku?

  3. Jak mohu zrušit všechny tabulky v databázi PostgreSQL?

  4. Jak získat první řádek na skupinu v PostgreSQL