有没有一个SQL函数可以提取字符串中字符的字母/数字/空格?

问题描述 投票:0回答:1

我正在使用 SQL Server 2014 和 SSMS,并且我有一些类似于“abc123-123”的数据,我想查询是否所有条目都像这样。

有没有办法创建此列“模式”:

id 价值 图案
1 果酱 aaax11
2 9*9 aaa1x1
3 21 年 21 11ax11

这样我就可以按模式分组进行计数?

只要它可以区分字母字符和数字字符以及这两个字符和其他字符,我就可以让它工作!

基本上寻找类似以下内容的东西:

SELECT PATTERN, COUNT(*)
FROM 
    (SELECT id, value, GETPATTERN(value) AS PATTERN
     FROM have) AS A
GROUP BY PATTERN
ORDER BY 2 DESC

在这个

GETPATTERN
函数上提供一些帮助,假设存在这样的事情。

在 Python 中这基本上是微不足道的:

def getalphanumberwhite(inString):
    resultList = []
    resultstring = ""
    for i in inString:
        if i.isnumeric():
            resultList.append("1")
        elif i.isalpha():
           resultList.append("a")
        else:
            resultList.append("x")    
    resultstring=''.join(resultList)
    return resultstring

print(getalphanumberwhite("Jam21&I 32"))
#Returns aaa11xax11

谢谢

sql sql-server string function pattern-matching
1个回答
0
投票

这样的UDF创建起来很简单...

CREATE OR ALTER FUNCTION dbo.F_COMPUTE_PATTERN (@STRING NVARCHAR(4000))
RETURNS NVARCHAR(4000)
WITH RETURNS NULL ON NULL INPUT
AS
BEGIN
   IF @STRING = N''
      RETURN N'';
   DECLARE @I SMALLINT = 1, @C NCHAR(1), @RETURN NVARCHAR(4000) = N'';
   WHILE @I <= LEN(@STRING)
   BEGIN
      SET @C = SUBSTRING(@STRING, @I, 1);
      SET @RETURN = @RETURN
                  + CASE 
                       WHEN @C BETWEEN '0' AND '9' THEN '1'                       
                       WHEN @C BETWEEN 'a' AND 'z' THEN 'a'
                       ELSE '-'
                    END;
      SET @I = @I + 1;
   END;
   RETURN @RETURN
END;
GO

现在你可以做:

WITH
T AS (SELECT * 
      FROM (VALUES (1, 'jam\21'), 
                   (2, 'byt9*9'), 
                   (3, '21y 21')) A (id, val)
      )
SELECT *, dbo.F_COMPUTE_PATTERN(val) AS PATTERN
FROM   T;

这就是结果:

id   val     PATTERN
---- ------- ---------
1    jam\21  aaa-11
2    byt9*9  aaa1-1
3    21y 21  11a-11

但要小心排序规则...

© www.soinside.com 2019 - 2024. All rights reserved.