我在Interbase中的substr
函数中遇到了一些问题,抛出“一般的SQL错误算术异常,数字溢出或字符串截断错误”。
select SUBSTR(note, 1, 150) note
from TABLE
注释字段为varchar(8192)
,但我希望只能返回前150个字符。我只能编写内联SQL,因此无法使用存储过程。
答案 0 :(得分:1)
最新版本的Interbase似乎是XE7,它的documentation读取:
substr()返回从位置开始到位置结束的子串。 注意:此函数最多可以接收和返回80个字符,即InterBase字符串的限制。
因此溢出错误是因为您将varchar(8192)
传递给接受varchar(80)
的函数。您需要查找其他一些版本为substr
且没有此限制的UDF库。
答案 1 :(得分: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)注释列的表中,如
CREATE TABLE "NOTES3"
(
"ID" INTEGER,
"NOTE" VARCHAR(8192),
"NOTEBLOB" COMPUTED BY (Note)
);
但是如果您尝试通过
访问NOTEBLOB列select cast(noteblob as varchar(150)) from notes3
你回到了“算术错误,数字溢出或字符串截断”。
答案 2 :(得分: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。