gpt4 book ai didi

sql - DB2 LIKE 运算符的奇怪长度限制

转载 作者:行者123 更新时间:2023-12-04 23:28:06 24 4
gpt4 key购买 nike

我发现 DB2 v9.7 和 SQL LIKE 有一个有趣的问题。运算符(operator)。看一下这个:

-- this works and returns one record
select 1
from SYSIBM.DUAL
where 'abc' like concat('a', 'bc')

-- this doesn't work
select 1
from SYSIBM.DUAL
where 'abc' like concat(cast('a' as varchar(2001)), cast('bc' as varchar(2000)))

-- It causes this error (from JDBC):
-- No authorized routine named "LIKE" of type "FUNCTION" having compatible
-- arguments was found.. SQLCODE=-440, SQLSTATE=42884, DRIVER=4.7.85

我已经玩过了长度,似乎只要长度加起来大于 4000,问题就会出现。 .如果我将整个连接的字符串“截断”回长度 4000 ,问题消失:
select 1 
from SYSIBM.DUAL
where 'abc' like
cast(concat(cast('a' as varchar(2001)), cast('bc' as varchar(2000)))
as varchar(4000))

有趣的是,它似乎真的与 CONCAT有关。功能。以下也有效:
select 1 
from SYSIBM.DUAL
where 'abc' like cast('abc' as varchar(32672))

有没有人遇到过这样的问题?它是 DB2 中的错误吗?或者一些无证限制? N.B:我在这里发现了一个类似的问题:

https://www-304.ibm.com/support/docview.wss?uid=swg1PM18687

鉴于另一个 IBM 产品在 2010 年为这个问题创建了一个解决方法,我想这不是一个真正的错误,否则它会同时得到修复吗?

最佳答案

真正的 啊哈! 在这里。

首先,根据 rules for the concatenation operator 结果类型,连接两个组合长度为 4000 字节或更少的 VARCHAR 会产生该组合长度的 VARCHAR,例如concat(varchar(2000), varchar(2000)) = varchar(4000) 。连接两个总长度为 4001 字节或更多的 VARCHAR 会产生一个长度为 32 700 的 LONG VARCHAR。虽然不推荐使用 LONG VARCHAR 类型,但我猜连接行为仍然使用遗留逻辑。

$ db2 describe "values concat(cast('a' as varchar(2000)), cast('bc' as varchar(2000)))"

Column Information

Number of columns: 1

SQL type Type length Column name Name length
-------------------- ----------- ------------------------------ -----------
448 VARCHAR 4000 1 1


$ db2 describe "values concat(cast('a' as varchar(2001)), cast('bc' as varchar(2000)))"

Column Information

Number of columns: 1

SQL type Type length Column name Name length
-------------------- ----------- ------------------------------ -----------
456 LONG VARCHAR 32700 1

其次, LIKE predicate 期望模式表达式是最大长度为 32672 字节的 VARCHAR。

随后,当您在不知不觉中尝试使用 LONG VARCHAR 作为模式表达式时,您会收到错误消息。与其说是操作数的长度,不如说是它的数据类型。以下应该工作:
select 1 
from SYSIBM.DUAL
where 'abc' like
cast(concat(cast('a' as varchar(2001)), cast('bc' as varchar(2000)))
as varchar(32672))

关于sql - DB2 LIKE 运算符的奇怪长度限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9234021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com