【问题标题】:DB2 - string match-inner joinDB2 - 字符串匹配内连接
【发布时间】:2024-01-17 21:54:01
【问题描述】:

我没有找到关于使用子字符串进行内部连接的太多信息。 我不太精通 SQL,我正在尝试在这里进行字符串匹配,但在 INNER JOIN 子句中的 LIKE 运算符出现问题。

我在表 1 和表 2 中有数据。例如表 1 有 JUY,表 2 有 Tyy_ss_JUY。两张表都有超过 10000 个整体。我想同时匹配两者并在匹配字符串时给我一个结果。

假设我有两个表如下:

表格1 位置ID 型号 CAMERA 1 区 A ABCD 2 区 B ALI 3 A区JUY 4 区 A LOS 5 区 C OMG 表2 车辆名称 本田 Txx_ss_ABCD Myvi Tyy_ss_ABCD 威驰 Tyy_ss_JUY 质子 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+'%'

预期结果

结果 车辆名称 本田 Txx_ss_ABCD Myvi Tyy_ss_ABCD 威驰 Tyy_ss_JUY 质子 Tyy_ss_LOS SUV Lyx_ss_JUY

执行此操作时,我在 DB2 中收到一条错误消息

在函数“DECFLOAT”的字符串参数中发现无效字符。SQLCODE=-420,SQLSTATE=22018,DRIVER=3.69.24 SQL 代码:-420,SQL 状态:22018

谢谢

【问题讨论】:

  • 使用'||'而不是 '+' 来连接。喜欢'%' ||副相机 || '%'
  • LIKE 相当昂贵,尤其是在使用前导通配符时,因为它通常会使使用索引来加快查询速度无效。对于Model,您的样本测试数据根本不需要它,而且您似乎也不需要sub.CAMERA 的尾随通配符(可能取决于该字段是CHAR 还是VARCHAR) .查询的替代形式:SELECT Table2.vehicle, Table2.name FROM Table1 JOIN Table2 ON Table2.name LIKE '%' || Table1.camera WHERE Table1.model = 'Zone A'(选择这种形式是为了简洁和关系方向)。

标签: db2 inner-join sql-like


【解决方案1】:

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), '%')
;

【讨论】: