【问题标题】:Sybase: how can I remove non-printable characters from CHAR or VARCHAR fields with SQL?Sybase:如何使用 SQL 从 CHAR 或 VARCHAR 字段中删除不可打印的字符?
【发布时间】:2010-02-10 21:30:51
【问题描述】:

我正在使用一个 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 上运行。

【问题讨论】:

    标签: sql etl sap-ase


    【解决方案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 function 至少似乎存在于 Sybase 上。

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

    【讨论】:

    • 感谢您的信息。我不知道 patindex 功能。看起来它会让我快到那里。不幸的是,我们无权实际修改表中的数据,只能在提取过程中过滤掉不良数据。我也不认为我们使用的 Sybase 版本有 collat​​e 功能。但我们确实有一个名为“stuff”的函数。 Stuff “返回通过从一个字符串中删除指定数量的字符并用另一个字符串替换它们而形成的字符串。”因此,如果我们使用 patindex 找到我们需要删除的字符并使用 stuff 删除它们,我想我们已经设置好了。
    猜你喜欢
    • 2022-01-20
    • 2020-04-08
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    相关资源
    最近更新 更多