2015-06-25 1 views
0

Здесь у меня есть 3 столбца: ID (NUMBER), PART_NAME (VARCHAR) и PART_VALUE (CLOB) (Все три формы являются Первичным ключом). У меня есть scenerio таким образом, что я должен проверять несколько условий для одного и того же столбца. Например: для частного идентификатора я должен проверить другое имя_компьютера и его соответствующее значение part_value. Ниже я ошибаюсь, я знаю. Только для справки я включаюКак создать оператор выбора, который удовлетворяет нескольким условиям из одного столбца?

SELECT COUNT(0) 
FROM MY_TABLE 
WHERE ID = 'XYZ' 
AND (
     (
      (
       PART_TYPE='SW NUT Prod' 
       AND DBMS_LOB.COMPARE(PART_VALUE,'NUT and Non-Standard Key')=0 
      ) 
     OR 
      (
       PART_TYPE='SW NUT Prod' 
       AND DBMS_LOB.COMPARE(PART_VALUE,'LIMES Key and Document')=0 
      ) 
     OR (
       PART_TYPE='SW NUT Prod' 
       AND DBMS_LOB.COMPARE(PART_VALUE,'LIMES Physical Key and Document')=0 
      ) 
     ) 
     AND (
      PART_TYPE='TRIM' 
      AND DBMS_LOB.COMPARE(PART_VALUE,'FALSE')=0 
     ) 
) 

Мы должны добиться этого. Я пробовал использовать суставы. Но это не помогло, потому что у нас очень большие запросы, и мы должны проверять 10 Part_name за один раз. Любое предложение помогло мне

+0

Нам понадобится дополнительная информация ... Что дает ваш ссылочный запрос? Как выглядят таблицы? Можете ли вы подстроить sqlfiddle, показывающий основные данные таблицы? – mmmmmpie

+0

Я беру счет из моего ссылочного запроса и основываясь на значении, я должен делать с разными операциями. Sqlfiddle [link] (http://sqlfiddle.com/#!4/d0e4e8) – Crazy2crack

+0

Итак, это может быть предложение 'having'? – mmmmmpie

ответ

1

Эти запросы могут помочь. Он добавляет столбец cnt каждой строки в таблице, которая сообщает, если удовлетворены все условия для этого ID:

with data as ( 
    SELECT id, part_type, part_value, 
     case when PART_TYPE='SW NUT Prod' 
     and (DBMS_LOB.COMPARE(PART_VALUE,'NUT and Non-Standard Key')=0 
      or DBMS_LOB.COMPARE(PART_VALUE,'LIMES Key and Document')=0 
      or DBMS_LOB.COMPARE(PART_VALUE,'LIMES Physical Key and Document')=0) 
     then 1 end c1, 
     case when PART_TYPE='TRIM' AND DBMS_LOB.COMPARE(PART_VALUE,'FALSE')=0 
     then 1 end c2 
    FROM MY_TABLE) 
select id, part_type, part_value, case when c1 > 0 and c2 > 0 then 1 else 0 end cnt 
    from (
    select id, part_type, part_value, 
     count(c1) over (partition by id) c1, count(c2) over (partition by id) c2 
     from data) 

SQLFiddle

По какой-то причине вы не хотите group by, но, конечно, вы можете упростить вывод, используя этот раздел. Если вас интересует только конкретный идентификатор, добавьте where id=XYZ в первый подзапрос. В SQLFiddle я добавил второй идентификатор, , где не все условия выполнены.

+0

Большое спасибо. Только одна небольшая проблема. Я просто хочу один выход, чтобы я мог двигаться дальше. Этот запрос дает мне все строки. Могу я, пожалуйста, помогите мне. Также дайте мне знать, как «group by» поможет, потому что я мог попробовать по-другому, что привело меня к какой-то проблеме производительности. – Crazy2crack

+0

Это очень маленькая модификация, добавьте 'where' в первый подзапрос и' distinct' в основной запрос, например, в [ скрипка] (http://sqlfiddle.com/#!4/64e7de/6). –

+0

-Спасибо. Он решил мою проблему. Не могли бы вы дать мне знать, как использовать «group by» в этом контексте. Если я использую идентификатор 'group by', я не получаю желаемого o/p. Должен ли я группироваться с помощью c1, c2, c3? @Ponder – Crazy2crack