子串错误interbase

时间:2017-01-26 01:42:59

标签: substring interbase

我在Interbase中的substr函数中遇到了一些问题,抛出“一般的SQL错误算术异常,数字溢出或字符串截断错误”

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

注释字段为varchar(8192),但我希望只能返回前150个字符。我只能编写内联SQL,因此无法使用存储过程。

3 个答案:

答案 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。