Sql 使用substr连接两个表

Sql 使用substr连接两个表,sql,db2,ibm-midrange,Sql,Db2,Ibm Midrange,我有两张桌子: 表a JRNO JSNO TEXT 1955 7 S0042 1000122000 表B CODE INV TYPE AWSE 1000122 CHE 我需要加入表以获得相关信息:- CODE INV TYPE JRNO JSNO AWSE 1000122 CHE 1955 7 为此,我使用以下SQL: SELECT CODE, INV, TYPE

我有两张桌子:

表a

JRNO    JSNO    TEXT
1955    7       S0042     1000122000
表B

CODE    INV        TYPE
AWSE    1000122    CHE
我需要加入表以获得相关信息:-

CODE    INV        TYPE    JRNO    JSNO
AWSE    1000122    CHE     1955    7
为此,我使用以下SQL:

SELECT CODE, INV, TYPE, JRNO, JSNO
FROM TABLEB
LEFT OUTER JOIN TABLEA ON SUBSTR(TEXT,11,7) = INV
WHERE INV = ‘1000122’
然而,结果如下:

CODE    INV        TYPE    JRNO    JSNO
AWSE    1000122    CHE  
似乎
“SUBSTR(TEXT,11,7)=INV”
没有响应


有人能帮我吗?

你有没有检查一下你从以下方面得到了什么:

SELECT JRNO, JSNO, TEXT, SUBSTR(TEXT, 11, 7) AS INV
  FROM TableA;
这能产生你所期望的吗?如果没有,那么这就是为什么带有连接的查询也不起作用的原因

如果它确实产生了您所期望的结果,那么问题就不会立即显现出来。

设置

create table tablea (jrno smallint, jsno smallint, text char(32));
create table tableb (code  char(8), inv char(8),type char(3));
insert into tablea values (1955,7,'S0042     1000122000');
insert into tableb values ('AWSE', '1000122', 'CHE');
使用子字符串

7: select code, inv, type, jrno, jsno
from tableb
left outer join tablea on substr(text,11,7) = inv
where inv = '1000122'
CODE    INV TYPE    JRNO    JSNO
====    === ====    ====    ====
AWSE        1000122     CHE 1955    7
使用定位

select code, inv, type, jrno, jsno
from tableb
LEFT OUTER JOIN TABLEA ON LOCATE('1000122', TEXT) > 0
CODE    INV TYPE    JRNO    JSNO
====    === ====    ====    ====
AWSE        1000122     CHE 1955    7
locate(search workd)中的第一个参数不能是列名,这就是为什么您尝试它时它不起作用的原因


CCSID是一种字符编码而不是列数据类型,因此,除非表的创建与我所拥有的不同,否则我看不出有什么问题。您能用您用来创建表的查询来更新我们吗?

@Cybernate有正确的答案,但架构还是一团糟。文本应分为两列:INV和任何最后四个字符。如果它们是数字,它们应该存储为数字,而不是文本。请尝试在LOCATE(INV,text)>0上的左外联接表a(更多)此外,INV的数据类型是什么?建议的定位也不起作用。表b上的INV是字符字段还是数字字段?我会得到“1000122”,但当我尝试联接它时,它不会得到最终结果。