varchar T-sql中每个字符的数据类型

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

我很好奇我从某人那里得到的数据。大多数时候我需要获得3个整数,然后是一个空格,然后是8个整数。

并且集成创建了一个列varchar(20)...不要怀疑它是否有效,但这给了我一些匹配错误。

因此,我想知道每行上字符的数据类型是什么。

例如:0表示整数,s表示空格,a表示char,*表示特定

AWB             | data type
---------------------------------
012 12345678    | 000s00000000
9/5 ab0534      | 0*0saa0000

我想知道是否有功能或公式来获得这种结果。在我能够按此列分组并最终能够检查数据质量有多好之后。

我不知道我试图解释的是否有一个特定的词,所以请原谅我,如果这是一个帖子的副本,我没有找到它。

感谢您的反馈意见。

sql tsql sqldatatypes
1个回答
1
投票

没有任何内置功能,但您可以使用这样的方法:

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())。

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