потому что поисковый фильтр с mybatis и spring возвращает всю таблицу - PullRequest
0 голосов
/ 27 октября 2019

Я выполняю поисковую систему с использованием spring и mybatis, поэтому мне нужно отфильтровать по двум записям в моей таблице, поэтому в документации Oracle я получил функцию NVL, но не могу успешно реализовать ее в своем запросе

SELECT 
    FC.COD_FCD,
    FC.DSC_FCD, 
    DS.DSC_DSL ,
    FC.COD_EST_GNC, 
    FC.COD_HBT 
FROM SPFS_DT_FACUL FC 
INNER JOIN  SPFS_DT_DSPLG DS 
    ON FC.COD_DSL = DS.COD_DSL 
WHERE 
    (
        FC.COD_AB='01' 
        AND FC.COD_FCD LIKE #{value1}||'%'
    ) 
    OR (
        FC.COD_AB='01' 
        AND FC.DSC_FCD LIKE #{value2}||'%'
    )

Я жду фильтрации записей, но мне возвращается вся таблица

1 Ответ

0 голосов
/ 27 октября 2019

В Oracle любое ненулевое значение соответствует условию LIKE NULL || '%'.

. Я думаю, что вы пытаетесь избежать совпадения условий, когда один (или оба) параметр имеют значение null. Простейшим способом будет явная проверка на ничтожность:

SELECT 
    FC.COD_FCD,
    FC.DSC_FCD, 
    DS.DSC_DSL ,
    FC.COD_EST_GNC, 
    FC.COD_HBT 
FROM SPFS_DT_FACUL FC 
INNER JOIN  SPFS_DT_DSPLG DS 
    ON FC.COD_DSL = DS.COD_DSL 
WHERE 
    FC.COD_AB='01' 
    AND 
        ( #{value1} IS NOT NULL AND FC.COD_FCD LIKE #{value1}||'%' )
        OR ( #{value2} IS NOT NULL AND FC.COD_FCD LIKE #{value2}||'%' )
    ) 

Также обратите внимание, что я факторизовал ваши условия от (A and B) or (A and C) до A and ( B or C`). Это делает выражение короче и легче для понимания.

...