Самое простое решение - привести обе стороны к integer
, как упоминал @Andrew, так что вы можете использовать простое приведение, или trycast(...)
, который попытается привести значение и, если это не удастся, не вернет ошибку, но NULL
значение вместо:
select *
from x
inner join y on
trycast(y.state as integer) = trycast(y.state as integer)
order by y.state
Старый ответ (оставьте это здесь ради будущих читателей и того, что вы можете / не можете сделать):
Если у вас последняя версия Teradata (вы ее не указали), у вас также будет функция LPAD
. Предполагая, что y.state
- это не текст, а число, которое нам также необходимо привести, поскольку lpad принимает строку в качестве аргумента. Если это так, опустите cast(...)
:
select *
from x
inner join y on
x.state = lpad(cast(y.state as varchar(5)), 5, '0')
order by y.state
Если у вас нет функции LPAD
, вам может пригодиться грязный код с substring
:
select *
from x
inner join y on
x.state = substring('00000' from char_length(cast(y.state as varchar(5))+1) || cast(y.state as varchar(5)
order by y.state
Выше предполагается, что вы храните номера в пределах максимум 5 цифр. Если оно превышает это число (в ваших данных для примера указано 5), вам необходимо изменить код.