2014-02-06 5 views
1

Где пытаются избежать создания двух курсоров sql, потому что нам просто нужно изменить предложение WHERE на динамическое.As400 - Dynamic Sql where where

Мы один курсор выполнения этого ИНЕКЕ:

WHERE TRIM (USUARIO) LIKE @USUARIO) 
AND CAST (M15 . FECLLEGADA AS DATE) BETWEEN @FINI AND @FFIN 
AND M15 . ESTINBOX IN ('A' , 'P') 
AND URGENTE LIKE (COALESCE (@URGENTE , '') CONCAT '%') 

и другой курсор с этим ИНЕКЕ:

WHERE 
    CAST (M15 . FECLLEGADA AS DATE) BETWEEN @FINI AND @FFIN 
    AND TRIM (USUARIO) LIKE @USUARIO 
    AND M15 . ESTINBOX LIKE (COALESCE (@ESTADO , '') CONCAT '%') 
    AND URGENTE LIKE (COALESCE (@URGENTE , '') CONCAT '%') 

Есть ли способ, чтобы выполнить это, где положение только в одном заявлении: ¿

Это то, что я пробовал:

WHERE 
CASE 
     WHEN @ESTADO='PR' then ESTINBOX IN ('A','P') 
     ELSE M15.ESTINBOX(COALESCE ( @ESTADO , '') CONCAT '%') 
END 

Хранимая процедура не компилируется. Если это возможно Как я могу добавить к CASE WHEN дополнительные предложения «И»

+0

Можете ли вы принять удар производительности при выполнении обоих операторов выбора и просто использовать результаты из одного? – Turophile

+0

@Turophile - Интересно, как он сравнивается с использованием условий поиска, не относящихся к SARGable. [Временная метка, по крайней мере, может быть безопасно запрошена) (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx). DB2 на 400 игнорирует конечные пробелы для сопоставлений, поэтому «USARIO» может быть также безопасно запрошен (путем постоянного удаления стартовых пробелов или с того, чтобы их не было). –

+0

@Turophile, проблема в том, что большой запрос почти такой же, за исключением предложения where, и я не хочу дублировать один и тот же код дважды: D –

ответ

3

Что-то вроде этого, может быть?

... WHERE TRIM (USUARIO) LIKE @USUARIO 
     AND CAST (M15.FECLLEGADA AS DATE) BETWEEN @FINI AND @FFIN 
     AND URGENTE LIKE (COALESCE (@URGENTE , '') CONCAT '%') 
     AND ( 
     (@ESTADO = 'PR' AND M15.ESTINBOX IN ('A' , 'P')) 
     OR 
     (@ESTADO != 'PR' AND M15.ESTINBOX LIKE COALESCE (@ESTADO , '') CONCAT '%' 
    ) 
+0

PR НЕ является реальным значением db. Просто флаг из .net –

+0

Я уверен, что я это вижу. В чем ваш смысл? – mustaccio

Смежные вопросы