【问题标题】:SQL - remove all letters (alpha characters) from a stringSQL - 从字符串中删除所有字母(字母字符)
【发布时间】:2022-01-09 00:34:22
【问题描述】:

我正在尝试编写一个函数,从字符串中删除任何出现的 26 个字母。

输入:'AA123A' -> 输出:'123'

输入:'AB-123-CD% -> 输出:'-123-%'

我在 Google 上只能找到如何删除非数字字符,这些字符似乎都是围绕定义要保留的数字而形成的。但我也想保留任何符号。

“简单”的答案是每个字母有 26 个嵌套 REPLACE,但我不敢相信没有更好的方法可以做到这一点。 我可以定义一个 A-Z 字符串并循环遍历每个字符,调用 REPLACE 26 次 - 使代码更简单但功能相同。

有没有人有一个优雅的解决方案?

【问题讨论】:

  • 您的 DBMS 是什么?你有其他软件处理记录插入吗?它比 SQL 更适合您的软件执行此操作。
  • 优雅的解决方案是使用编程语言而不是 sql 来完成。话虽如此,一些数据库支持(或至少部分支持)正则表达式 - 包括 regex_replace - 这意味着它可以通过单个替换来完成。
  • 不同的数据库平台对这类事情有不同的功能/语法。例如,在 postgres 中,您可以使用正则表达式,而对于 MS SQL Server,这并不总是一种选择。始终为您的特定平台/DBMS 添加标签是一个好主意(至少)。
  • 谢谢。它是一个 MS SQL 服务器,特别是 Azure SQL 服务器。我很确定 regex_replace 不受支持,因为我已经尝试过其中一种。不幸的是,对于数据的导入,我们无能为力。看起来它可能是循环——我之前写过一个用于删除参数化符号字符串的循环——所以这没什么大不了的。作为一种方法,它并不是很理想。
  • replace(translate('abc123afz', 'abcdefghijklmnopqrstuvwxyz', replicate('a',26)), 'a', '') .. dbfiddle.uk/…

标签: sql sql-server replace alphanumeric


【解决方案1】:

如果我理解正确,您可以使用 TRANSLATE,例如:

SELECT REPLACE(TRANSLATE('AB-123-  CDdcba%', 'ABCDabcd','        '), ' ', '');
SELECT REPLACE(TRANSLATE('AB-123-  CDdcba%', 'ABCDabcd','AAAAAAAA'), 'A', '');
  • 第一个案例也修剪空格,
  • 第二个,保留现有空间。

只需将其余字符添加到 'ABCDabcd' 参数并保持 'AAAAAAAA' 与第二个参数的长度相同。

【讨论】:

  • 完美!这正是我所需要的。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 2015-02-26
  • 2015-11-14
相关资源
最近更新 更多