【问题标题】:data type of each characters in a varchar T-sqlvarchar T-sql 中每个字符的数据类型
【发布时间】:2019-08-08 22:40:18
【问题描述】:

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

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

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

例如:0代表整数,s代表空格,a代表字符,*代表特定

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

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

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

感谢您的反馈。

【问题讨论】:

    标签: sql tsql sqldatatypes


    【解决方案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() 会更容易)。

    【讨论】:

    • 非常感谢,首先是结果,其次是解释。我不擅长 CROSS APPLY 使用。
    • @ValentinC 哦,这很简单:APPLY 可以看作是 row-wise-join。除了 normal JOIN,它是 集合的结合,这是计算的 row-by-row 方法,因此我们可以使用行的价值观并处理它们。
    猜你喜欢
    • 2015-07-21
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2014-10-30
    相关资源
    最近更新 更多