Сопоставьте объединенное поле со списком переменных

Добрый день,

Я пытаюсь сопоставить список адресных полей (объединенных для получения значения ALL_ADDRESS) с отдельной таблицей, содержащей суффиксы, потенциально длиной в сотни строк.

мой желаемый результат - показать те записи, где суффиксы являются частью переменной ALL_address (т.е. PARIS STREET)

это отлично работает, когда я объединяюсь без присоединения, но когда я начинаю присоединяться, я получаю сообщение об ошибке:

select   s.suffix,
          x.key,
          x.B_ADDR1_TX,
          x.B_ADDR2_TX,
          x.B_ADDR3_TX, 
          x.b_addr_city,
          x.b_addr_postcd,
          x.b_addr_cntry,
          x.b_addr_state_cd,

         x.B_ADDR1_TX || ' ' || x.B_ADDR2_TX || ' ' || x.B_ADDR3_TX || ' ' || x.b_addr_city || ' ' || x.b_addr_postcd || ' ' || x.b_addr_cntry || ' ' || x.b_addr_state_cd as All_Address

          from test_table AS x

JOIN suffix_list AS s 

WHERE 

x.All_Address LIKE CONCAT('%',s.suffix,'%') ;

любая помощь приветствуется


person MR_E    schedule 25.01.2017    source источник


Ответы (2)


Я не уверен, что вы пытаетесь сделать. Но правильный синтаксис требует предложения on для join:

from test_table x join
     suffix_list s 
     on x.All_Address LIKE CONCAT('%', s.suffix, '%')

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

В Oracle это обычно записывается так:

from test_table x join
     suffix_list s 
     on x.All_Address LIKE '%' || s.suffix || '%'
person Gordon Linoff    schedule 25.01.2017
comment
извините, переключение между соединениями SQL и Oracle (долгая история) после удаления AS это все еще не работает. также я согласен, что он должен быть включен, однако можно использовать оба способа - person MR_E; 25.01.2017

Не использовал Oracle какое-то время, но:

CREATE table t1 (
 a varchar(5),
 b varchar(5),
 c varchar(5));
 INSERT INTO t1 VALUES ('one','two','three');
 INSERT INTO t1 VALUES ('two','nine','five');
 INSERT INTO t1 VALUES ('two','one','one');

  CREATE TABLE t2 (filter varchar(5));
  INSERT INTO t2 VALUES ('one');
  INSERT INTO t2 VALUES ('six');


  WITH t1new AS (SELECT t1.*, a || ' ' || b || ' ' || c as address  FROM t1) 

  SELECT t1new.*
  FROM t1new,t2
  WHERE address like CONCAT(CONCAT('%', t2.filter),'%')

Вышеприведенный пример выполняется в liveql Oracle.

person KonradK    schedule 25.01.2017
comment
как ваш стиль, но все та же ошибка, я боюсь: строка ParseException 13:37 не может распознать ввод рядом с '|' '' '' '|' в выражении.... - person MR_E; 25.01.2017
comment
Я также попробовал ваш пример в HUE Hive, поскольку мне было интересно, было ли это связано с Oracle, но я также получил то же сообщение, что и для моего и вашего в Oracle: ошибка при компиляции оператора: FAILED: строка ParseException 1:31 не может распознать ввод рядом '|' '' '' '|' в спецификации выражения - person MR_E; 26.01.2017