0

我正在使用一个 Sybase 数据库,该数据库似乎在某些字符串字段中包含不可打印的字符,这会丢弃我们的一些处理代码。乍一看,它似乎只有换行符和回车,但其中还有一个 ASCII 代码 27 - 一个 ESC 字符、一些重音字符和一些其他奇怪的东西。

我没有直接访问权限来更改数据库,因此更改坏数据不是一种选择。现在我不得不将其过滤掉。我们正在尝试从一个数据库中导出表数据,并在夜间批处理中将其加载到另一个应用程序使用的数据库中。

理想情况下,我想要一个可以传递字符列表并让 Sybase 返回删除了这些字符的数据的函数。如果可能的话,我想保留一些我们可以用普通 SQL 做的事情。

像这样删除 ASCII 0 - 31 的字符。

从表中选择 str_replace(FIELD1, (0-31), NULL) 作为 FIELD1,str_replace(FIELD2, (0-31), NULL) 作为 FIELD2

到目前为止, str_replace 是我能找到的最近的,但它只允许用另一个字符串替换一个字符串。不支持字符范围,也不会让我做上述事情。

我们在 Unix 服务器上的 Sybase ASE 12.5 上运行。

4

1 回答 1

1

像这样的东西在 SQL Server 中有效,它使用像 Sybase 这样的 T-SQL:

while @@ROWCOUNT > 0
    UPDATE TheTable
    SET strColumn = REPLACE(strColumn, SUBSTRING(strColumn, 
        PATINDEX('%[^a-zA-Z0-9 ]%', 
        strColumn collate Latin1_General_BIN), 1), '')
    WHERE PATINDEX('%[^a-zA-Z0-9 ]%', 
        strColumn collate Latin1_General_BIN) <> 0

patindex 函数至少出现在 Sybase 上。

排序规则需要匹配二进制;否则[a]将匹配'á'。

于 2010-02-10T21:52:52.337 回答