тип данных каждого символа в varchar T-sql - PullRequest
0 голосов
/ 18 марта 2019

Мне любопытно, какие данные я получаю от кого-то. В большинстве случаев мне нужно получить 3 целых числа, затем пробел, а затем восемь целых.

И интеграция создала столбец varchar (20) ... Не сомневаюсь, что это работает, но это дает мне несколько ошибок соответствия.

В связи с этим я хотел бы знать, каков тип данных символов в каждой строке.

Например: 0 для целого числа, s для пробела, a для символа, * для конкретного

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

Я бы хотел знать, есть ли функция или формула для получения такого рода результатов. Сразу после этого я смогу группировать по этому столбцу и, наконец, смогу проверить, насколько хорошо качество данных.

Я не знаю, есть ли конкретное слово для того, что я пытался объяснить, поэтому извините, если это дубликат сообщения, я не нашел его.

Спасибо за ваш отзыв.

1 Ответ

1 голос
/ 18 марта 2019

Нет ничего встроенного, но вы можете использовать такой подход:

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

...