DB2-字符串匹配内部联接

DB2-字符串匹配内部联接,db2,inner-join,sql-like,Db2,Inner Join,Sql Like,我没有找到太多关于子字符串内部联接的信息。 我对SQL不是很精通,我试图在这里进行字符串匹配,但在内部连接子句中的LIKE运算符遇到了问题 我在表1和表2中有数据。例如,表1有JUY,表2有Tyy\U ss\U JUY。这两个表都有超过10000个实体。我希望两者都匹配,并在匹配字符串时给我一个结果 假设我有两个表,如下所示: Table1 LocationID Model CAMERA 1 Zone A ABCD 2 Zon

我没有找到太多关于子字符串内部联接的信息。 我对SQL不是很精通,我试图在这里进行字符串匹配,但在
内部连接
子句中的
LIKE
运算符遇到了问题

我在表1和表2中有数据。例如,表1有JUY,表2有Tyy\U ss\U JUY。这两个表都有超过10000个实体。我希望两者都匹配,并在匹配字符串时给我一个结果

假设我有两个表,如下所示:

Table1 LocationID Model CAMERA 1 Zone A ABCD 2 Zone B ALI 3 Zone A JUY 4 Zone A LOS 5 Zone C OMG 预期结果

Result Vehicle NAME Honda Txx_ss_ABCD Myvi Tyy_ss_ABCD Vios Tyy_ss_JUY Proton Tyy_ss_LOS SUV Lyx_ss_JUY 结果 车辆名称 本田Txx\U ss\U ABCD Myvi Tyy\u ss\u ABCD Vios Tyy_ss_JUY 宝腾泰斯洛斯酒店 SUV Lyx_ss_JUY 当我执行此命令时,在DB2中会收到一条错误消息

Invalid character found in a character string argument of the function "DECFLOAT".. SQLCODE=-420, SQLSTATE=22018, DRIVER=3.69.24 SQL Code: -420, SQL State: 22018 在函数“DECFLOAT”的字符串参数中找到无效字符。。SQLCODE=-420,SQLSTATE=22018,DRIVER=3.69.24 SQL代码:-420,SQL状态:22018
谢谢

DB2不支持字符串连接的“+”符号。
使用以下方法之一获得所需结果:

with 
  Table1(LocationID, Model, CAMERA) as (values
  (1, 'Zone A', 'ABCD')
, (2, 'Zone B', 'ALI')
, (3, 'Zone A', 'JUY')
, (4, 'Zone A', 'LOS')
, (5, 'Zone C', 'OMG')
)
, Table2 (Vehicle, NAME) as (values
  ('Honda', 'Txx_ss_ABCD')
, ('Myvi', 'Tyy_ss_ABCD')
, ('Vios', 'Tyy_ss_JUY')
, ('Proton', 'Tyy_ss_LOS')
, ('SUV', 'Tyb_ss_OMG')
, ('SUV', 'UUS_ss_OMG')
, ('SUV', 'Lyx_ss_JUY')
)
SELECT Vehicle,NAME
FROM Table2
INNER JOIN (SELECT CAMERA FROM Table1 WHERE Model LIKE '%Zone A%')sub on 
NAME LIKE 
'%'||sub.CAMERA||'%'
--concat(concat('%', sub.CAMERA), '%')
;

DB2不支持字符串连接的“+”符号。
使用以下方法之一获得所需结果:

with 
  Table1(LocationID, Model, CAMERA) as (values
  (1, 'Zone A', 'ABCD')
, (2, 'Zone B', 'ALI')
, (3, 'Zone A', 'JUY')
, (4, 'Zone A', 'LOS')
, (5, 'Zone C', 'OMG')
)
, Table2 (Vehicle, NAME) as (values
  ('Honda', 'Txx_ss_ABCD')
, ('Myvi', 'Tyy_ss_ABCD')
, ('Vios', 'Tyy_ss_JUY')
, ('Proton', 'Tyy_ss_LOS')
, ('SUV', 'Tyb_ss_OMG')
, ('SUV', 'UUS_ss_OMG')
, ('SUV', 'Lyx_ss_JUY')
)
SELECT Vehicle,NAME
FROM Table2
INNER JOIN (SELECT CAMERA FROM Table1 WHERE Model LIKE '%Zone A%')sub on 
NAME LIKE 
'%'||sub.CAMERA||'%'
--concat(concat('%', sub.CAMERA), '%')
;

使用“| |”而不是“+”来连接。像“%”| | sub.camera |‘%”
Like
相当昂贵,特别是对于前导通配符,因为它通常会使使用索引加速查询的操作无效。对于
Model
,您的示例测试数据根本不需要它,而且您似乎也不需要
sub.CAMERA
的尾随通配符(可能取决于字段是
CHAR
还是
VARCHAR
)。另一种查询形式:
从表1中选择Table2.vehicle、Table2.name,将Table2.name连接到Table2.name上的Table2,如“%”| | Table1.camera,其中Table1.model='Zone A'
(选择此形式是为了简洁和关系的方向)。使用“| |”而不是“+”来连接。像“%”| | sub.camera |‘%”
Like
相当昂贵,特别是对于前导通配符,因为它通常会使使用索引加速查询的操作无效。对于
Model
,您的示例测试数据根本不需要它,而且您似乎也不需要
sub.CAMERA
的尾随通配符(可能取决于字段是
CHAR
还是
VARCHAR
)。另一种查询形式:
从表1中选择Table2.vehicle,Table2.name将Table2.name连接到Table2.name上,如“%”| | Table1.camera,其中Table1.model='Zone A'
(选择此形式是为了简洁和关系的方向)。