子字符串间错误

问题描述 投票:0回答:4

我在 Interbase 中的

substr
函数上遇到一些问题,抛出 “一般 SQL 错误算术异常、数字溢出或字符串截断错误”

select SUBSTR(note, 1, 150) note
from TABLE

注释字段为

varchar(8192)
,但我希望能够仅返回前 150 个字符。我只能编写内联 SQL,因此不可能使用存储过程。

substring interbase
4个回答
2
投票

Interbase 的最新版本似乎是 XE7,它的 documentation 内容如下:

substr() 返回从位置 开始到位置 结束的子字符串。 注意:该函数最多可以接收和返回 80 个字符,这是 InterBase 字符串的限制。

所以溢出错误是因为您将

varchar(8192)
传递给接受
varchar(80)
的函数。您需要寻找其他一些具有
substr
版本但没有此限制的 UDF 库。


0
投票

我不确定这是否会对您有很大帮助,但如果您有一个定义为 BLOB SUB_TYPE TEXT 的注释字段,您可以这样做

select cast(note as varchar(150)) from notes

不幸的是,我找不到在 varchar 字段上使用 CAST 将其转换为另一个较小大小的 varchar 的方法 - 我收到错误“算术错误、数字溢出或字符串截断”

当然,将 varchar(8192) 转换为 blob 似乎是不可能的,然后您可以像上面那样将其转换为 varchar!我不知道这是IB的SQL设计的无能还是血腥。

更奇怪的是,您可以将 BLOB 计算列添加到具有 varchar(8192) note 列的表中,如下所示

CREATE TABLE "NOTES3" 
(
  "ID"  INTEGER,
  "NOTE"    VARCHAR(8192),
  "NOTEBLOB"     COMPUTED BY (Note)
);

但是如果您尝试通过

访问NOTEBLOB列
select cast(noteblob as varchar(150)) from notes3

您又回到“算术错误、数字溢出或字符串截断”。


0
投票

如果您使用 Firebird 2.x+ 那么您应该使用

select SUBSTRING(note FROM 1 FOR 150) note
from TABLE

如果字段注释是 BLOB,这将返回 BLOB 类型。

您还可以尝试将结果转换为 varchar。

select cast(SUBSTRING(note FROM 1 FOR 150) as varchar(150)) note
from TABLE

我不知道这是否也适用于 Interbase。


0
投票

我现在正在寻找其他东西,但我怀疑原来问题的答案是这样的:

select SUBSTR(note, 1, 75) || SUBSTR(note, 76, 75) FinalNote FROM Table

我不确定 IB 将如何响应非常短的字符串(长度小于 75 个字符),因此您可能需要在第二个 SUBSTR() 中将空格连接到音符末尾(就像我连接了两个SUBSTR() 的)。

© www.soinside.com 2019 - 2024. All rights reserved.