Informix Server 10 并删除 select 中的 CR 字符
Informix Server 10 and remove CR character in select
我需要在 Informix Server 10 中删除 select 中的 CR 字符。
函数 chr
在版本 10 中不存在,所以当我尝试这样替换时
REPLACE(text_column, chr(10), ' ')
我收到这样的错误:
Routine (chr) can not be resolved. [SQL State=IX000, DB
Errorcode=-674]
函数ascii(10)
也不行。
提前致谢
我无法访问 IDS 10,但看看这是否适合您。
请记住,这是 LF
的示例:
LF
- ASCII Code 10, Line Feed;
CR
- ASCII Code 13, Carriage Return.
首先确保您的会话 IFX_ALLOW_NEWLINE 设置为 true:
> EXECUTE PROCEDURE IFX_ALLOW_NEWLINE('T');
Routine executed.
>
现在让我们看一个例子:
> CREATE TABLE tab1 (col1 CHAR(100));
Table created.
> INSERT INTO tab1 VALUES ('teste' || CHR(10) || '1');
1 row(s) inserted.
> SELECT col1 FROM tab1;
col1 teste
1
1 row(s) retrieved.
> SELECT REPLACE(col1, '
> ', ' ') FROM tab1;
(expression) teste 1
1 row(s) retrieved.
>
旁注:
这是我使用的代码,最初是在 2005 年,在 Informix 获得 CHR 和 ASCII 函数之前:
CREATE PROCEDURE ascii(C CHAR) RETURNING INT AS result;
DEFINE i INTEGER;
IF c IS NULL THEN
LET i = 0;
ELSE
SELECT val INTO i FROM ascii WHERE chr = c;
END IF;
RETURN i;
END PROCEDURE;
CREATE PROCEDURE chr(i INTEGER) RETURNING CHAR(1) AS result;
DEFINE c CHAR;
IF i < 0 OR i > 255 THEN
RAISE EXCEPTION -746, 0, 'CHR(): integer value out of range 0..255';
END IF;
IF i = 0 OR i IS NULL THEN
LET c = NULL;
ELSE
SELECT chr INTO c FROM ascii WHERE val = i;
END IF;
RETURN c;
END PROCEDURE;
CREATE TABLE ascii
(
val INTEGER NOT NULL UNIQUE CONSTRAINT u1_ascii,
chr CHAR(1) NOT NULL UNIQUE CONSTRAINT u2_ascii
);
REVOKE ALL ON ascii FROM PUBLIC;
GRANT SELECT ON ascii TO PUBLIC;
还有一个数据文件,编号为1..255和对应的字符代码。它在 UTF-8 终端上打印效果不佳,因为一半字符(从 128..255 开始)在被视为 UTF-8 时被破坏为 UTF-8。它仅适用于 ISO 8859-15(8859-1,...)等代码集。您可以确定 ASCII 真的意味着代码点 1..127;因为这些代码点的 UTF-8 和 ASCII 表示是相同的,所以可以工作。
如果您确实无法为 ASCII table 生成合适的加载文件,请告诉我(通过电子邮件 - 查看我的个人资料;它可能已经在 IIUG Software archive 中可用)和我可以向您发送带有数据的压缩存档以及上面的 SQL(压缩 tar 文件格式的总计 1716 字节)。
我需要在 Informix Server 10 中删除 select 中的 CR 字符。
函数 chr
在版本 10 中不存在,所以当我尝试这样替换时
REPLACE(text_column, chr(10), ' ')
我收到这样的错误:
Routine (chr) can not be resolved. [SQL State=IX000, DB Errorcode=-674]
函数ascii(10)
也不行。
提前致谢
我无法访问 IDS 10,但看看这是否适合您。
请记住,这是 LF
的示例:
LF
- ASCII Code 10, Line Feed;
CR
- ASCII Code 13, Carriage Return.
首先确保您的会话 IFX_ALLOW_NEWLINE 设置为 true:
> EXECUTE PROCEDURE IFX_ALLOW_NEWLINE('T');
Routine executed.
>
现在让我们看一个例子:
> CREATE TABLE tab1 (col1 CHAR(100));
Table created.
> INSERT INTO tab1 VALUES ('teste' || CHR(10) || '1');
1 row(s) inserted.
> SELECT col1 FROM tab1;
col1 teste
1
1 row(s) retrieved.
> SELECT REPLACE(col1, '
> ', ' ') FROM tab1;
(expression) teste 1
1 row(s) retrieved.
>
旁注:
这是我使用的代码,最初是在 2005 年,在 Informix 获得 CHR 和 ASCII 函数之前:
CREATE PROCEDURE ascii(C CHAR) RETURNING INT AS result;
DEFINE i INTEGER;
IF c IS NULL THEN
LET i = 0;
ELSE
SELECT val INTO i FROM ascii WHERE chr = c;
END IF;
RETURN i;
END PROCEDURE;
CREATE PROCEDURE chr(i INTEGER) RETURNING CHAR(1) AS result;
DEFINE c CHAR;
IF i < 0 OR i > 255 THEN
RAISE EXCEPTION -746, 0, 'CHR(): integer value out of range 0..255';
END IF;
IF i = 0 OR i IS NULL THEN
LET c = NULL;
ELSE
SELECT chr INTO c FROM ascii WHERE val = i;
END IF;
RETURN c;
END PROCEDURE;
CREATE TABLE ascii
(
val INTEGER NOT NULL UNIQUE CONSTRAINT u1_ascii,
chr CHAR(1) NOT NULL UNIQUE CONSTRAINT u2_ascii
);
REVOKE ALL ON ascii FROM PUBLIC;
GRANT SELECT ON ascii TO PUBLIC;
还有一个数据文件,编号为1..255和对应的字符代码。它在 UTF-8 终端上打印效果不佳,因为一半字符(从 128..255 开始)在被视为 UTF-8 时被破坏为 UTF-8。它仅适用于 ISO 8859-15(8859-1,...)等代码集。您可以确定 ASCII 真的意味着代码点 1..127;因为这些代码点的 UTF-8 和 ASCII 表示是相同的,所以可以工作。
如果您确实无法为 ASCII table 生成合适的加载文件,请告诉我(通过电子邮件 - 查看我的个人资料;它可能已经在 IIUG Software archive 中可用)和我可以向您发送带有数据的压缩存档以及上面的 SQL(压缩 tar 文件格式的总计 1716 字节)。