Autor | Zpráva | ||
---|---|---|---|
carlosP Profil |
#1 · Zasláno: 1. 8. 2012, 22:37:07
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 |
#2 · Zasláno: 1. 8. 2012, 22:58:21
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 |
#3 · Zasláno: 1. 8. 2012, 23:10:51
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 |
#4 · Zasláno: 1. 8. 2012, 23:45:43
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 |
#5 · Zasláno: 2. 8. 2012, 00:26:01
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 |
#6 · Zasláno: 2. 8. 2012, 01:36:25
Když se chceš drbat levou nohou za pravým uchem, tvoje volba.
|
||
Časová prodleva: 12 let
|
0