Autor Zpráva
carlosP
Profil
Mám v DB v PostgreSQL položky, kde je uložené PHP serializované pole, kde teď potřebuji vyhledávat a porovnávat určitý klíč z tohoto pole.
Zkouším něco jako příklad níže, ale bohužel tento zápis je příliš žravý a omezit to pomocí [^"] nemohu, protože v hledaném textu jsou obsaženy i ".

Zkoušel někdo v PG/SQL parsovat PHP pole? Nebo jak omezit ten výraz níže?

regexp_matches(db_col, 's:[0-9]+:"key_php";s:[0-9]+:"(.*)";', 'ism')

Jde o větší objem dat a všechny je unserialitovat v php a porovnat nelze :-(

Děkuji
Keeehi
Profil
Mě se zdá už ten celý návrh postavený na hlavu. Co je to za tak divné pole, že nelze uložit normálně jako data do tabulky do jednotlivých sloupečků?
carlosP
Profil
Keeehi:
To není návrh, je to několik let stará DB, které nejsem ani autorem a v tom serializovaném poli je jakýsi log, který se pak porovná pomocí array_diff() pro konkretní skupinu záznamu, ale já teď potřebuju v tomto vyhledávat napříč všemi záznamy ale jen určitou položku a je unserialozovat cca 100tis zaznamů a porovnávat je v PHP nejde.
Keeehi
Profil
carlosP:
Tak si tu starou databázi nejdříve převeď do normálního tvaru a pak v ní teprve vyhledávej.
carlosP
Profil
Tak neco jako funguje:

SELECT col1, TRIM(SUBSTRING(php_array_col FROM (POSITION(len[1] IN php_array_col) + LENGTH(len[1]) + 1) FOR len[2]::integer)) FROM (
  SELECT col1, php_array_col, regexp_matches(php_array_col, '(s:[0-9]+:"php_key";s:([0-9]+):)', 'ism') AS len
  FROM table
) AS Q
Keeehi
Profil
Když se chceš drbat levou nohou za pravým uchem, tvoje volba.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: