Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres无法识别加入时强制转换的问题_Sql_Postgresql_Join_Casting - Fatal编程技术网

Sql Postgres无法识别加入时强制转换的问题

Sql Postgres无法识别加入时强制转换的问题,sql,postgresql,join,casting,Sql,Postgresql,Join,Casting,我正试图根据ID列将两个表连接在一起。联接未成功工作,因为尽管使用了cast(),但我无法联接integer列上的varchar列 在第一个表中,ID列的格式为:XYZA-123456,可以是字符。 在第二个表中,ID列只是数字:123456 -- TABLE 1 create table fake_receivers(id varchar(11)); insert into fake_receivers(id) values ('VR2W-110528'), ('VR2W-113640')

我正试图根据ID列将两个表连接在一起。联接未成功工作,因为尽管使用了
cast()
,但我无法联接
integer
列上的
varchar

在第一个表中,ID列的格式为:
XYZA-123456
,可以是字符。 在第二个表中,ID列只是数字:
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.
奇怪的是,我可以用我的完整数据集(显示一个查询的结果集)执行这个连接,但是我根本不能操作它(例如,排序、过滤它)-我得到一个错误,说
错误:整数的输入语法无效:“UWM”
。字符串“UWM”在我的数据集或代码中没有出现,但我强烈怀疑它与从
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

编辑

您需要将当前逻辑直接包含在连接条件中:

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

这肯定有帮助。我仍然得到一个神秘的
错误:整数的无效输入语法:“UWM”
在我的完整数据库中-将用更复杂的数据更新上面的数据,看看我是否可以重新创建它。那么很可能你的数据有一些问题。请注意,现在读到这篇文章的任何人:我的代码中的小错误,我将在明天修复,但是Tim在下面的回答中使用了正确的代码,正确地复制并随后解决了这个问题。“智能钥匙”——你伪造的接收器id值——是一种设计反模式。我不太明白,你能解释一下吗?如果你指的是数字前有字母和破折号,我对此无能为力,这就是传感器硬件输出数据的方式;在第二个表中,我们并不总是知道与序列号相关联的字母代码,但总是知道序列号,并且序列号总是对齐的。不理想,但在第一个表中拆分字符串是我唯一的选择。无论我们记录的是什么原始传感器数据,我们都可以将适当的数据提取到更合适的模式中。