As400 — предложение Dynamic Sql where

Где пытаются избежать создания двух 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 CLAUSE:

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 всего в одном выражении:¿

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

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

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


person Carlos Landeras    schedule 06.02.2014    source источник
comment
Можете ли вы принять удар по производительности при одновременном выполнении обоих операторов select и просто использовании результатов одного из них?   -  person Turophile    schedule 07.02.2014
comment
@Turophile - интересно, как это по сравнению с использованием поисковых запросов, не поддающихся поиску. По крайней мере, метку времени можно безопасно запросить. DB2 на 400 игнорирует конечные пробелы для сравнений, поэтому USARIO также можно безопасно запрашивать (удалив начальные пробелы навсегда или если их нет с самого начала).   -  person Clockwork-Muse    schedule 07.02.2014
comment
@Turophile, проблема в том, что большой запрос почти такой же, за исключением предложения where, и я не хочу повторять один и тот же код дважды: D   -  person Carlos Landeras    schedule 07.02.2014
comment
@Turophile, зачем ты вообще это предложил? Кажется, нет никакой причины иметь их как два отдельных запроса, за исключением того, что сначала не было понятно, как это сделать. Верно, Карлос? Мустаччо дал хорошее решение.   -  person WarrenT    schedule 07.02.2014


Ответы (1)


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

... 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 '%' 
      )
person mustaccio    schedule 06.02.2014
comment
PR НЕ ЯВЛЯЕТСЯ реальным значением в дБ. Просто флаг из .net - person Carlos Landeras; 06.02.2014