ГДЕ (набор условий) ИЛИ (множество вторых условий) ИЛИ ... написанное элегантно


7 принят

Вы должны уметь:

SELECT *
FROM ALL_TESTS
WHERE (COMPANY, MATERIAL, Test, Property, Condition, State) IN
          ( (Company1, Material1, Test1, Property1, Condition1, State1),
            (Company2, Material2, Test2, Property2, Condition2, State2)
          )

0

Если бы у вас были данные для соответствующих компаний в другой таблице, вы могли бы сделать простое соединение и получить свой результат:

SELECT at.*
FROM ALL_TESTS
INNER JOIN MATCHING_COMPANIES mc
    ON at.COMPANY   = mc.COMPANY AND
       at.MATERIAL  = mc.MATERIAL AND
       at.Test      = mc.Test AND
       at.Property  = mc.Property AND
       at.Condition = mc.Condition AND
       at.State     = mc.State

Конечно, для этого требуется отдельная таблица, но создание таблицы temp в Oracle или VBA, надеюсь, не так много проблем, как это невозможно.


0

Поместите свое место в таблицу (temp) (столбцы: MATERIAL, Test, Property, Condition, State), вставьте в нее возможные значения (каждый OR - это строка), затем внутреннее соединение этой таблицы с исходным (ALL_TESTS), с все столбцы таблицы temp, например:

Select *
from ALL_TESTS
inner join temp1 on ALL_TESTS.MATERIAL = temp1.MATERIAL 
AND ALL_TESTS.Test = temp1.Test
AND ALL_TESTS.Property = temp1.Property
.... all other columns 

И поэтому у вас может быть много строк в temp1, все другое OR и простой выбор для запроса


0

В дополнение к решению Gordon я могу предложить использовать типы объектов oracle с пользовательской логикой сравнения для обработки проблемы сравнения NULL:

CREATE OR REPLACE TYPE test_obj as object(
  company varchar2(100),
  material varchar2(100),
  property varchar2(100),
  condition varchar2(100),
  map member function get_unique_key return varchar2  
)
/

CREATE OR REPLACE TYPE BODY test_obj as 
  map member function get_unique_key return varchar2
  as
  begin
    return nvl(company,'?')||'|'||nvl(material,'?')||'|'||nvl(property,'?')||'|'||nvl(condition,'?');
  end;  
end;
/

DROP TABLE all_tests;

CREATE TABLE all_tests
(
  test          VARCHAR2(100),
  test_obj      TEST_OBJ
)
;

insert into all_tests
select 'TEST1', test_obj('XXX', null, 'test', null)
  from dual 
;

select * from all_tests
where test_obj = test_obj('XXX', null, 'test', null);
TEST     TEST_OBJ
------   --------------
TEST1    (XXX, , test, )
SQL, Oracle, Microsoft Excel-VBA,

sql,oracle,excel-vba,

1

Ответов: 4


7 принят

Вы должны уметь:

SELECT *
FROM ALL_TESTS
WHERE (COMPANY, MATERIAL, Test, Property, Condition, State) IN
          ( (Company1, Material1, Test1, Property1, Condition1, State1),
            (Company2, Material2, Test2, Property2, Condition2, State2)
          )

0

Если бы у вас были данные для соответствующих компаний в другой таблице, вы могли бы сделать простое соединение и получить свой результат:

SELECT at.*
FROM ALL_TESTS
INNER JOIN MATCHING_COMPANIES mc
    ON at.COMPANY   = mc.COMPANY AND
       at.MATERIAL  = mc.MATERIAL AND
       at.Test      = mc.Test AND
       at.Property  = mc.Property AND
       at.Condition = mc.Condition AND
       at.State     = mc.State

Конечно, для этого требуется отдельная таблица, но создание таблицы temp в Oracle или VBA, надеюсь, не так много проблем, как это невозможно.


0

Поместите свое место в таблицу (temp) (столбцы: MATERIAL, Test, Property, Condition, State), вставьте в нее возможные значения (каждый OR - это строка), затем внутреннее соединение этой таблицы с исходным (ALL_TESTS), с все столбцы таблицы temp, например:

Select *
from ALL_TESTS
inner join temp1 on ALL_TESTS.MATERIAL = temp1.MATERIAL 
AND ALL_TESTS.Test = temp1.Test
AND ALL_TESTS.Property = temp1.Property
.... all other columns 

И поэтому у вас может быть много строк в temp1, все другое OR и простой выбор для запроса


0

В дополнение к решению Gordon я могу предложить использовать типы объектов oracle с пользовательской логикой сравнения для обработки проблемы сравнения NULL:

CREATE OR REPLACE TYPE test_obj as object(
  company varchar2(100),
  material varchar2(100),
  property varchar2(100),
  condition varchar2(100),
  map member function get_unique_key return varchar2  
)
/

CREATE OR REPLACE TYPE BODY test_obj as 
  map member function get_unique_key return varchar2
  as
  begin
    return nvl(company,'?')||'|'||nvl(material,'?')||'|'||nvl(property,'?')||'|'||nvl(condition,'?');
  end;  
end;
/

DROP TABLE all_tests;

CREATE TABLE all_tests
(
  test          VARCHAR2(100),
  test_obj      TEST_OBJ
)
;

insert into all_tests
select 'TEST1', test_obj('XXX', null, 'test', null)
  from dual 
;

select * from all_tests
where test_obj = test_obj('XXX', null, 'test', null);
TEST     TEST_OBJ
------   --------------
TEST1    (XXX, , test, )
SQL, Oracle, Microsoft Excel-VBA,