Ключевые обходные пути db2 varchar

Я начинаю понимать преимущества отказа от использования varchar для ввода ключей, как описано в здесь

Я работаю с базой данных DB2, которую я не настраивал, в которой есть большая таблица (более 20 миллионов строк) с ключевым полем varchar. Структура таблицы такова:

key_field | matching_field1  
000-XXX | 123  
0000-XXX | 456  
00-XXXXX | 789  

key_field имеет переменную длину. Я пытаюсь использовать key_field для ссылки на меньшую таблицу с 4k строками. Проблема в том, что после символов в key_field. Я знаю это, потому что если я ищу конкретную строку, используя

SELECT * WHERE key_field LIKE '000-XXX' совпадений нет, но если я попробую '000-XXX%', будет выбрана строка. Я предполагаю, что это та же самая причина, по которой я не могу ввести свою вторую таблицу, которая содержит соответствующий key_field, но которая была обрезана, поэтому нет конечных пробелов.

Предполагая, что я не могу редактировать, дублировать или транспонировать эту большую таблицу (по крайней мере, не в массовом порядке из-за ограничений ресурсов), есть ли способ привязать ее к меньшей таблице (4k строк), содержащей тот же key_field?

Я могу редактировать и управлять меньшей таблицей.

Обновление: выполняя приведенный ниже запрос с использованием RTRIM, я получаю сообщение об ошибке.

Запрос:

SELECT RTRIM(foreign_key)  
FROM Small_Table  
EXCEPT SELECT RTRIM(key_field)  
FROM Big_Table

Ошибка:

NUMBER OF ROWS DISPLAYED IS 0
SQLCODE = -904, ERROR:  UNSUCCESSFUL EXECUTION CAUSED BY AN
UNAVAILABLE RESOURCE. REASON 00C90084, TYPE OF RESOURCE 00000100, AND
RESOURCE NAME DB2-MANAGED SPACE WITHOUT SECONDARY ALLOCATION OR
USER-MANAGED SPACE IN MYDB_NAME

person joshi123    schedule 09.11.2016    source источник
comment
Можно ли TRIM() использовать в объединении?   -  person M O'Connell    schedule 10.11.2016
comment
Только что попробовал, TRIM() можно использовать в соединении в DB2. Однако эффективность может пострадать.   -  person M O'Connell    schedule 10.11.2016
comment
Не уверен, на какой платформе вы используете DB2. В DB2 для Linux, UNIX, Windows конечные пробелы в поле VARCHAR игнорируются при выполнении сравнений. (Таким образом, если значение ABC хранится в столбце VARCHAR(10), предикат WHERE column = 'ABC' все равно вернет нужную строку.   -  person Ian Bjorhovde    schedule 10.11.2016
comment
@IanBjorhovde, похоже, что конечные пробелы игнорируются, поскольку, когда я пытаюсь WHERE column = 'ABC', строка выбирается.   -  person joshi123    schedule 10.11.2016


Ответы (1)


используйте эти команды для объединения ваших таблиц

если у вас есть только пробелы в конце строки

rtrim(key_field)=rtrim(keyothertable)

если у вас есть только пробелы в начале строки

ltrim(key_field)=ltrim(keyothertable)

если у вас есть пробелы в начале и / или в конце строки (решение 1)

trim(key_field)=trim(keyothertable)

если у вас есть пробелы в начале и / или в конце строки (решение 21)

strip(key_field)=strip(keyothertable)

Недостатком использования функций "trim / rtrim / ltrim / strip" на ваших клавишах является то, что индексы могут не использоваться (для проверки)

Может быть, вы можете преобразовать ключ столбцов в varchar, если индексы не используются ...

person Esperento57    schedule 10.11.2016
comment
Спасибо, попробовали этот подход, но возникла ошибка, см. Обновленный вопрос выше. - person joshi123; 10.11.2016