我很好奇我从某人那里得到的数据。大多数时候我需要获得3个整数,然后是一个空格,然后是8个整数。
并且集成创建了一个列varchar(20)...不要怀疑它是否有效,但这给了我一些匹配错误。
因此,我想知道每行上字符的数据类型是什么。
例如:0表示整数,s表示空格,a表示char,*表示特定
AWB | data type
---------------------------------
012 12345678 | 000s00000000
9/5 ab0534 | 0*0saa0000
我想知道是否有功能或公式来获得这种结果。在我能够按此列分组并最终能够检查数据质量有多好之后。
我不知道我试图解释的是否有一个特定的词,所以请原谅我,如果这是一个帖子的副本,我没有找到它。
感谢您的反馈意见。
没有任何内置功能,但您可以使用这样的方法:
DECLARE @tbl TABLE(ID INT IDENTITY,AWB VARCHAR(100));
INSERT INTO @tbl VALUES
('012 12345678')
,('9/5 ab0534');
WITH cte AS
(
SELECT t.ID
,t.AWB
,A.Nmbr
,C.YourMask
FROM @tbl t
CROSS APPLY (SELECT TOP (DATALENGTH(t.AWB)) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values) A(Nmbr)
CROSS APPLY (SELECT SUBSTRING(t.AWB,A.Nmbr,1)) B(SingleCharacter)
CROSS APPLY (SELECT CASE WHEN B.SingleCharacter LIKE '[0-9]' THEN '0'
WHEN B.SingleCharacter LIKE '[a-z]' THEN 'a'
WHEN B.SingleCharacter = ' ' THEN 's'
ELSE '*' END) C(YourMask)
)
SELECT ID
,AWB
,(
SELECT YourMask
FROM cte cte2
WHERE cte2.ID=cte.ID
ORDER BY cte2.Nmbr
FOR XML PATH(''),TYPE
).value('.','nvarchar(max)') YourMaskConcatenated
FROM cte
GROUP BY ID,AWB;
简而言之:
cte
将创建一个派生的表格集。
只要当前的CROSS APPLY
值,第一个AWB
将创建一个数字列表。第二个CROSS APPLY
将分别读取每个字符。
第三个CROSS APPLY
最终将使用一些相当简单的逻辑将您的值转换为您期望的掩码。
然后最终的SELECT
将使用GROUP BY
和与FOR XML
相关的子查询来重新连接掩码字符(使用版本v2017 +这将更容易调用STRING_AGG()
)。