выбрать строки из выбранных строк - PullRequest
0 голосов
/ 28 января 2012

у меня работает следующий синтаксис процедуры:

select count(1) from
from
(
  select id,
  CASE
  when a >= 0 and a <= 30 then 'one'    
  when a >= 31 and a <= 60  then 'two'    
  when a >= 61 and a <= 90  then 'three'    
  else 'NO'
  END
  FROM tabel_1 t
  Where
  (
        (
           TO_CHAR(t.aDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD') AND    
                TO_CHAR(pTo_Date, 'YYYYMMDD')                    
                                                                 //cond1
        ) OR
        (
           TO_CHAR(t.bDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD') AND    
                TO_CHAR(pTo_Date, 'YYYYMMDD')                                                      
                                                                 //cond2
        )OR
        (
           TO_CHAR(t.bDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD') AND    
                TO_CHAR(pTo_Date, 'YYYYMMDD')                                                      
                                                                 //cond3
        )

        AND

        (
              p_Type = 'Admin' AND
                            t.ID > 0    //condA
        )OR
        < 0
        (
          SELECT COUNT(1)
                            FROM tab_2 t2
                            WHERE t2.ID = USER_ID AND
                                  t.ID = t2.ID              condB
        )
   )
  )


)

Я имею в виду следующий пункт

     Where
     ( (
                  (
              TO_CHAR(t.aDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD') AND    


              TO_CHAR(pTo_Date, 'YYYYMMDD')                    
                                                             //cond1
                ) OR
                (
                   TO_CHAR(t.bDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD')              

                   AND

                        TO_CHAR(pTo_Date, 'YYYYMMDD')                                                      
                                                             //cond2
                )OR
                (
                   TO_CHAR(t.bDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD') 

                    AND    
                        TO_CHAR(pTo_Date, 'YYYYMMDD')                                                      
                                                             //cond3
                ) )

должно работать только для

                       ( (
                        p_Type = 'Admin' AND
                        t.ID > 0    //condA
                       )OR
                         < 0
                       (
                             SELECT COUNT(1)
                             FROM tab_2 t2
                              WHERE t2.ID = USER_ID AND
                              t.ID = t2.ID              condB
                        ) )

// p_type - это varchar, который имеет некоторое значение для сопоставления. и USER_ID - это int, которое содержит целочисленное значение. Я хочу, чтобы cond1 ИЛИ con2 ИЛИ con3 работал только для condA ИЛИ condB .. я имею в виду, я хочу, чтобы этот результат отображался только для администратора или совпадающего идентификатора пользователя для идентификатора tab_2. я думаю, что это не правильно. потому что это работает для обоих операторов ИЛИ. может кто-нибудь, пожалуйста, помогите .. спасибо заранее

1 Ответ

2 голосов
/ 28 января 2012

То, что ваш подзапрос делает в данный момент:

cond1 OR cond2 OR (cond3 AND condA) OR condB

То есть, это будет истина, если cond1, cond2 или condB имеют значение true или когда cond3 и condA оба имеют значение true.

Но я думаю, что вы хотите:

(cond1 OR cond2 OR cond3) AND (condA OR condB)

Где это верно только в том случае, если любое из cond1, cond2 или cond3 верно, а любое из condA или condB верно.

Если это так, то вам нужно заключить в скобки первые 3 конда и последние два:

select count(1) from
from
(
  select id,
  CASE
  when a >= 0 and a <= 30 then 'one'    
  when a >= 31 and a <= 60  then 'two'    
  when a >= 61 and a <= 90  then 'three'    
  else 'NO'
  END
  FROM tabel_1 t
  Where
  ( (
        (
           TO_CHAR(t.aDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD') AND    
                TO_CHAR(pTo_Date, 'YYYYMMDD')                    
                                                                 //cond1
        ) OR
        (
           TO_CHAR(t.bDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD') AND    
                TO_CHAR(pTo_Date, 'YYYYMMDD')                                                      
                                                                 //cond2
        )OR
        (
           TO_CHAR(t.bDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD') AND    
                TO_CHAR(pTo_Date, 'YYYYMMDD')                                                      
                                                                 //cond3
        ) )

        AND

        ( (
              p_Type = 'Admin' AND
                            t.ID > 0    //condA
        )OR
        < 0
        (
          SELECT COUNT(1)
                            FROM tab_2 t2
                            WHERE t2.ID = USER_ID AND
                                  t.ID = t2.ID              condB
        ) )
   )
  )


)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...