Я пытаюсь объединить две таблицы на основе столбца идентификатора. Объединение не работает успешно, потому что я не могу присоединиться к столбцу varchar
в столбце integer
, несмотря на использование cast()
.
В первой таблице столбец идентификаторов различается символами в формате: XYZA-123456
.
Во второй таблице столбец идентификатора - это просто число: 123456
.
-- TABLE 1
create table fake_receivers(id varchar(11));
insert into fake_receivers(id) values
('VR2W-110528'),
('VR2W-113640'),
('VR4W-113640'),
('VR4W-110528'),
('VR2W-110154'),
('VMT2-127942'),
('VR2W-113640'),
('V16X-110528'),
('VR2W-110154'),
('VR2W-110528');
-- TABLE 2
create table fake_stations(receiver_sn integer, station varchar);
insert into fake_stations values
('110528', 'Baff01-01'),
('113640', 'Baff02-02'),
('110154', 'Baff03-01'),
('127942', 'Baff05-01');
Мое решение состоит в том, чтобы разбить строку в тире, взять число после тире и привести его к целому числу, чтобы я мог выполнить соединение:
select cast(split_part(id, '-', 2) as integer) from fake_receivers; -- this works fine, seemingly selects integers
Однако, когда я действительно пытаюсь выполнить соединение, я получаю следующую ошибку, несмотря на использование явного приведения:
select cast(split_part(id, '-', 2) as integer), station
from fake_receivers
inner join fake_locations
on split_part = fake_locations.receiver_sn -- not recognizing split_part cast as integer!
>ERROR: operator does not exist: character varying = integer
>Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Как ни странно, я могу выполнить это объединение с моим полным набором данных (обнаруживается запрашиваемый набор результатов), но затем я вообще не могу манипулировать им (например, сортировать, фильтровать) - я получаю сообщение об ошибке ERROR: invalid input syntax for integer: "UWM"
. Строка "UWM" нигде не встречается ни в моем наборе данных, ни в моем коде, но я сильно подозреваю, что это связано с приведением split_part с varchar
до integer
, где-то что-то не так.
-- Misc. info
select version();
>PostgreSQL 10.5 on x86_64-apple-darwin16.7.0, compiled by Apple LLVM version 9.0.0 (clang-900.0.39.2), 64-bit
РЕДАКТИРОВАТЬ : Показывать поведение dbfiddle