使用 TSQL 从字段中提取数字字符的最快方法是什么?

use*_*632 1 sql-server

有一个包含 varchar(100) - OrderNum 字段值的大表,如下所示:

“BO2003056-2”

需要从此字段中提取所有数字字符,以便后续连接到另一个表。

例如:“BO2003056-2”将转换为“20030562”

由于 TSQL 中本身不存在 RegEx,那么在 TSQL 中执行此操作的最快方法是什么?

SQL 2019(数据库兼容模式 2014)

mus*_*cio 5

像这样的事情,可能是:

with t (input) as (select 'BO2003056-2')
select 
 replace(
  translate(
   input,
   'ABCDEFGHIJKLMNOPQRSTUVXYZ-',
   '                          '
  ),
  ' ', ''
 ) 
from t
Run Code Online (Sandbox Code Playgroud)

您必须亲自测试这是否是“最快的”,但这可能是最简单的方法。

请注意,在SQL Server 版本TRANSLATE()中,第三个参数(替换字符串)的长度必须与第二个参数(要替换的字符)的长度相同。

您可以避免计算要删除的所有字符:

with t (input, unwanted) as (
  select 'BO2003056-2', 'ABCDEFGHIJKLMNOPQRSTUVXYZ-'
)
select 
 replace(
  translate(
   input,
   unwanted,
   replicate(' ', len(unwanted))
  ),
  ' ', ''
 ) 
from t
Run Code Online (Sandbox Code Playgroud)

在其他 DBMS 中,第三个参数可以更短,并且没有替换的字符将被简单地删除,从而使这种方法变得更加简单。例如,在 Postgres 中:

with t (s) as (select 'BO2003056-2')
select 
 translate(s, 'ABCDEFGHIJKLMNOPQRSTUVXYZ-', '')
from t
Run Code Online (Sandbox Code Playgroud)