Sybase:如何使用SQL从CHAR或VARCHAR字段中删除不可打印的字符?

时间:2010-02-10 21:30:51

标签: sql etl sybase-ase

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

我无法直接访问更改数据库,因此无法更改错误数据。现在我必须把它过滤掉。我们尝试从一个数据库导出表数据,并在夜间批处理过程中将其加载到另一个应用程序使用的数据库中。

理想情况下,我希望有一个函数,我可以传递一个字符列表,只是让Sybase返回删除了这些字符的数据。如果可能的话,我想保留一些我们可以在纯SQL中做的事情。

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

选择str_replace(FIELD1,(0-31),NULL)作为FIELD1,   str_replace(FIELD2,(0-31),NULL)为FIELD2 来自TABLE

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

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

1 个答案:

答案 0 :(得分: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

Sybase至少似乎存在patindex function

校对需要匹配二进制;否则[a]会匹配'á'。