我正在使用 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
谢谢
这样的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
但要小心排序规则...