Проблема с Postgres, не распознающая CAST при соединении - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь объединить две таблицы на основе столбца идентификатора. Объединение не работает успешно, потому что я не могу присоединиться к столбцу 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

1 Ответ

0 голосов
/ 20 ноября 2018

Вы должны включить свою текущую логику непосредственно в условие соединения:

select *
from fake_receivers r
inner join fake_stations s
    on split_part(r.id, '-', 2)::int = s.receiver_sn;

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...