子串错误interbase

Substring error interbase

我在使用 Interbase 中的 substr 函数时遇到了一些问题 "a general SQL error arithmetic exception, numeric overflow or string truncation error".

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

备注字段是 varchar(8192),但我希望能够 return 仅前 150 个字符。我只能写内联 SQL 所以使用存储过程是不可能的。

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

substr() returns the substring of starting at position and ending at position . Note: This function can receive and return up to 80 characters, the limit on an InterBase character string.

所以溢出错误是因为您将 varchar(8192) 传递给接受 varchar(80) 的函数。您需要寻找一些其他的 UDF 库,它的 substr 版本没有这个限制。

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

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

不幸的是,我找不到在 varchar 字段上使用 CAST 将其转换为另一个更小的 varchar 的方法 - 我收到错误 "Arithmetic error, numeric overflow or string truncation"

当然,将 varchar(8192) 转换为 blob 似乎是不可能的,然后您可以像上面那样将其转换为 varchar!不知道是IB的SQL.

设计的无能还是bloody-mindedness

更奇怪的是,您可以将 BLOB 计算列添加到具有 varchar(8192) 注释列的 table,如

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

但是如果您随后尝试通过

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

你回到了 "Arithmetic error, numeric overflow or string truncation"。

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

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

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

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

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

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