Oznámení
dibi fluent + oracle limit v podmienke IN %l
před 7 lety
- fliper333
- Člen | 36
Ahojte,
Dnes som narazil na obmedzenie ORACLE, kde vo vetve „WHERE [row] IN %l“ ma limit 1000 zaznamov. Robim ale s velkou databazou, kde potrebujem porovnat viac ako 1000 udajov.
Nasiel som ako sa to da obist. Pole sa rozdeli na mensie polia s dlzkou 1000 (v PHP array_chunk) a potom sa prikaz prepise nasledovne:
WHERE [row] IN %l, pole[0] OR
WHERE [row] IN %l, pole[1] OR
…
Neviem ale ako cez dibi fluent tento prikaz zlozit, ak v nom mam viac podmienok. Fluent mi prida OR na koniec prikazu a tym padom to nefunguje ako ma. Tieto OR prikazy musia byt v zatvorke a celok musi byt pripojeny k prikazu cez AND.
$query =
dibi::select('ID')
->from('USERS')
->where('ACTIVE = %s', 'Y')
->where('REPORT IS NOT NULL');
$managers = array_chunk($managers, 1000);
foreach ($managers as $m)
$query->or('MANAGER_ID IN %l', $m);
return $query->fetchPairs();
Vysledok aky by som potreboval:
SELECT
[ID]
FROM
[USERS]
WHERE
[ACTIVE] = 'Y'
AND
REPORT IS NOT NULL
AND
(
[MANAGER_ID] IN (...) OR
[MANAGER_ID] IN (...) OR
[MANAGER_ID] IN (...)
)
Vysledok aky mi to generuje:
SELECT
[ID]
FROM
[USERS]
WHERE
[ACTIVE] = 'Y'
AND
REPORT IS NOT NULL
OR
[MANAGER_ID] IN (...)
OR
[MANAGER_ID] IN (...)
OR
[MANAGER_ID] IN (...)
Vopred dakujem za rady.
před 7 lety
- Milo
- Nette Core | 1119
$db
->select('ID')->from('USERS')
->where('ACTIVE = %s', 'Y')
->where('REPORT IS NOT NULL')
->where('(%or)', array(
array('MANAGER_ID IN %in', array(1, 2, 3)),
array('MANAGER_ID IN %in', array(4, 5, 6)),
array('MANAGER_ID IN %in', array(7, 8, 9)),
))
před 7 lety
- fliper333
- Člen | 36
Tak toto ma vazne nenapadlo :) Diky moc Milo.