【问题标题】:SQL and IBM I systemsSQL 和 IBM I 系统
【发布时间】:2025-12-25 20:20:17
【问题描述】:

我有一个 SQL 解决方案,可以分别从 2 个表(QUOTES 和 CLIENTS)中的 contractnumber# 检索类似的 quotenumber#。这在 Internet 上的任何 SQL Fiddle 中都可以正常工作。请参阅下面的所有 SQL 来创建解决方案(我添加了创建和插入表语句只是为了方便 SELECT 语句工作):

CREATE TABLE QUOTES
(`quotenumber` varchar(10));

INSERT INTO QUOTES
(`quotenumber`)
VALUES
('10006'),
('10007'),
('10008'),
('10009');

CREATE TABLE CLIENTS
(`contractnumber` varchar(21));

INSERT INTO CLIENTS
(`contractnumber`)
 VALUES
('PRXQTE-10006'),
('PRXQTE-10007'),
('FRR-13'),
('JK1222222'),
('X'),
('');

这是 SELECT 语句:

SELECT H.quotenumber
FROM QUOTES as H
INNER JOIN CLIENTS as P 
ON P.contractnumber LIKE CONCAT('%', H.quotenumber, '%');

但是,当我在 IBM I 环境中运行此 SQL 时,此 SELECT 语句不起作用。例如,当我尝试在 IBM I Access Client Solution 的 sql 编辑器中运行下面的 SELECT 语句时,我收到此错误:

 SQL 状态:42605 供应商代码:-170 消息: [SQL0170] 数量 函数 CONCAT 的参数无效。原因 。 . . . . : 一种 函数指定的参数数量不正确。如果 这个函数是一个用户定义的函数引用,一个 使用当前路径未找到具有此签名的函数。 恢复 。 . . : 更正为 功能。请参阅 DB2 for IBM i SQL 参考主题集合 在 IBM i 信息中心的数据库类别中 功能信息。如果这是用户定义的函数,请更正 路径或函数签名。再次尝试请求。

有谁知道这个 SELECT 语句的 DB2 改编版本或者 IBM i 可以使用什么替代方法?

【问题讨论】:

  • 您可以使用dbfiddle.uk/?rdbms=db2_11.1 作为 DB2 测试平台。
  • 谢谢戈登。你知道我一直在寻找 db2 fiddle。谢谢
  • 。 .我唯一要注意的是,DB2 的变体似乎与 Sybase 的变体一样多。因此,对于基础知识(例如您的问题)应该没问题,但可能与您的实际数据库有所不同。

标签: sql db2 db2-400


【解决方案1】:

嗯,根据documentation 可悲的是,DB2 中的concat() 只能(完全)采用两个参数:

CONCAT 函数将两个参数组合成一个字符串表达式。

您可以通过嵌套 concat() 调用来解决这个问题:

... concat(concat('%', h.quotenumber), '%') ...

这并不漂亮,但应该可以在 DB2 和 DBMS 中使用,concat() 接受任意数量的参数。

【讨论】:

【解决方案2】:

我想我找到了一个解决方案,它是一种变通方法并在 DB2 中运行(我添加了第二列以证明它检索到正确的相应引号#s):

SELECT H.quotenumber, P.contractnumber FROM QUOTES as H  
             INNER JOIN CLIENTS as P ON H.quotenumber = SUBSTRING( P.contractnumber, 8, 5 );   

【讨论】:

    【解决方案3】:

    你可以使用

    SELECT H.quotenumber
      FROM QUOTES as H
      JOIN CLIENTS as P 
        ON P.contractnumber LIKE '%' || H.quotenumber, || '%';
    

    但您不应该这样做,因为它确实会破坏数据库中的每个索引。见this

    【讨论】:

    • 谢谢,我再看看