Присоедините BIGINT к VARCHAR, где VARCHAR содержит только небольшое количество нечисловых символов.

Я пытаюсь объединить две таблицы фактов в базе данных Netezza по общему полю acct_nbr. В таблице a это BIGINT, а в таблице b он закодирован как VARCHAR. (У меня нет контроля над дизайном таблицы, и я подозреваю, что она настроена как VARCHAR, потому что она заполняется веб-вводом и должна допускать опечатки.) Я хотел бы игнорировать альфа-символы для объединения - я' m хочет исключить из таблицы b все поля, содержащие нечисловые символы. (Поле также содержит -,?,! и т.д.)

Я пробовал следующее:

  1. Базовое соединение. Выдает представление Bad int8 для «9999R99999», я полагаю, основываясь на первой неконвертируемой записи VARCHAR, с которой он сталкивается.
  2. Использование приведения/преобразования в обоих полях (в BIGINT для b.acct_nbr, в VARCHAR для a.acct_nbr), которое я мог реализовать неправильно. Различные ошибки, никаких результатов.
  3. Используя «выберите... из table_a соединение table_b b on (a.acct_nbr=b.acct_nbr и b.acct_nbr не похоже на '%[^0-9]%')». Кажется, я не могу заставить эту работу работать, и я не нашел хорошего объяснения того, как работает синтаксис '%[]%'. Я знаю, что делает %, но плохо понимаю, как использовать карат и скобки.

Я уверен, что это простая проблема, но я бьюсь головой о стену. Любая помощь высоко ценится!


person Andrew Cheesman    schedule 02.02.2014    source источник
comment
Покажите некоторые соответствующие образцы данных, насколько случайны символы в этом varchar? в начале в конце, повсюду и т. д.   -  person Mihai    schedule 03.02.2014
comment
Повсюду, для ~ 1 на 1000 записей. Наиболее распространенными типами являются «11111A111111», «111-111-1111» и «111?111111111».   -  person Andrew Cheesman    schedule 03.02.2014


Ответы (1)


Вы можете выполнить присоединение несколькими различными способами.

    select ... 
    from table_a a join 
    table_b b on (a.acct_nbr=b.acct_nbr 
and translate(b.acct_nbr,'1234567890','') in ('','.','-','-.')

Или, если у вас установлен инструментарий функций sql, вы можете сделать это.

    select ... 
        from table_a a join 
        table_b b on 
(a.acct_nbr=sql_functions..regexp_extract(b.acct_nbr,'^[0-9]{1,18}')
person Niederee    schedule 03.02.2014