У меня есть данные, как показано ниже

98-45.3A-22
104-44.0A-23
00983-29.1-22
01757-42.5A-22
04968-37.3A2-23

Вывод Ищем вывод, как показано ниже, в SQL Server

00098-BA45.3A-IN-22
00104-BA44.0A-IN-23
00983-BA29.1-IN-22
01757-BA42.5A-IN-22
04968-BA37.3A2-IN-23
2
Vinay 6 Сен 2016 в 12:44

5 ответов

Лучший ответ

Попробуй это,

DECLARE @String VARCHAR(100) = '98-45.3A-22'
SELECT  ISNULL(REPLICATE('0',6 - CHARINDEX('-',@String)),'')        -- Add leading Zeros
        + STUFF(
                STUFF(@String,CHARINDEX('-',@String),1,'-BA'),      -- Add 'BA'
                CHARINDEX('-',@String,CHARINDEX('-',@String)+1)+2,  -- 2 additional for the character 'BA' 
                1,'-IN')    --  Add 'IN'

Что делать, если у меня перед первым дефисом более 6 цифр, и я хочу удалить ведущие нули, чтобы получилось 6 цифр.

DECLARE @String VARCHAR(100) = '0000098-45.3A-22'
SELECT  CASE WHEN CHARINDEX('-',@String) <= 6 
            THEN ISNULL(REPLICATE('0',6 - CHARINDEX('-',@String)),'')        -- Add leading Zeros
                + STUFF(
                        STUFF(  @String,CHARINDEX('-',@String),1,'-BA'),      -- Add 'BA'
                        CHARINDEX('-',@String,CHARINDEX('-',@String)+1)+2,  -- 2 additional for the character 'BA' 
                        1,'-IN')    --  Add 'IN'
            ELSE STUFF(
                        STUFF(
                                STUFF(@String,CHARINDEX('-',@String),1,'-BA'),      -- Add 'BA'
                                CHARINDEX('-',@String,CHARINDEX('-',@String)+1)+2,  -- 2 additional for the character 'BA' 
                                1,'-IN'),    --  Add 'IN'
                        1, CHARINDEX('-',@String) - 6, ''       -- remove extra leading Zeros
                        )
        END
1
Jatin Patel 7 Окт 2016 в 07:32

По-другому, используя PARSENAME(), вы можете использовать этот запрос:

 WITH t AS (
SELECT 
    PARSENAME(REPLACE(REPLACE(s, '.', '@@@'), '-', '.'), 3) AS p1,
    REPLACE(PARSENAME(REPLACE(REPLACE(s, '.', '@@@'), '-', '.'), 2), '@@@', '.') AS p2,
    PARSENAME(REPLACE(REPLACE(s, '.', '@@@'), '-', '.'), 1) AS p3
FROM yourTable)
SELECT RIGHT('00000' + p1, 5) + '-BA' + p2 + '-IN-' + p3
FROM t;
0
shA.t 6 Сен 2016 в 10:18

Я разделил части, чтобы справиться с хитрыми шаблонами данных. Это должно работать даже с двухзначным хвостом без тире:

WITH Src AS
(
    SELECT * FROM (VALUES
    ('98-45.3A-22'),
    ('104-44.0A-23'),
    ('00983-29.1-22'),
    ('01757-42.5A-22'),
    ('04968-37.3A2-23')
    ) T(X)
), Parts AS
(
    SELECT *,
    RIGHT('00000'+SUBSTRING(X, 1, CHARINDEX('-',X, 1)-1),5) Front,
    'BA'+SUBSTRING(X, CHARINDEX('-',X, 1)+1, 2) BA,
    SUBSTRING(X, PATINDEX('%.%',X), LEN(X)-CHARINDEX('-', REVERSE(X), 1)-PATINDEX('%.%',X)+1)  P,
    SUBSTRING(X, LEN(X)-CHARINDEX('-', REVERSE(X), 1)+1, LEN(X)) En
    FROM Src
)
SELECT Front+'-'+BA+P+'-IN'+En
FROM Parts

Он возвращает:

00098-BA45.3A-IN-22
00104-BA44.0A-IN-23
00983-BA29.1-IN-22
01757-BA42.5A-IN-22
04968-BA37.3A2-IN-23
3
Paweł Dyl 6 Сен 2016 в 10:12

Предполагается, что формат согласован (например, всегда заканчивается на "-" + 2 символа ....)

DECLARE @Data TABLE (Col1 VARCHAR(100))
INSERT @Data ( Col1 )
SELECT Col1 
FROM (
    VALUES ('98-45.3A-22'), ('104-44.0A-23'),
        ('00983-29.1-22'), ('01757-42.5A-22'),
        ('04968-37.3A2-23')
) x (Col1)


SELECT RIGHT('0000' + LEFT(Col1, CHARINDEX('-', Col1) - 1), 5)
    + '-BA' + SUBSTRING(Col1, CHARINDEX('-', Col1) + 1, CHARINDEX('.', Col1) - CHARINDEX('-', Col1))
    + SUBSTRING(Col1, CHARINDEX('.', Col1) + 1, LEN(Col1) - CHARINDEX('.', Col1) -  3)
    + '-IN-' + RIGHT(Col1, 2)
FROM @Data

ИМО не идеально постоянно выполнять эти манипуляции со строками в SQL. Вы можете перенести его на свой уровень представления или сохранить предварительно отформатированное значение в базе данных, чтобы каждый раз экономить на этом.

1
AdaTheDev 6 Сен 2016 в 10:06

Используйте REPLICATE И CHARINDEX :

Репликация: будет повторять данный символ до достижения необходимого количества, указанного в функции

CharIndex: находит первое вхождение любого символа.

Declare @Data AS VARCHAR(50)='98-45.3A-22'
SELECT REPLICATE('0',6-CHARINDEX('-',@Data)) + @Data    

SELECT 
    SUBSTRING
    (
        (REPLICATE('0',6-CHARINDEX('-',@Data)) +@Data)
        ,0
        ,6
    )
    +'-'+'BA'+  CAST('<x>' + REPLACE(@Data,'-','</x><x>') + '</x>' AS XML).value('/x[2]','varchar(max)')
    +'-'+ 'IN'+ '-' + CAST('<x>' + REPLACE(@Data,'-','</x><x>') + '</x>' AS XML).value('/x[3]','varchar(max)')
0
Sandip - Full Stack Developer 6 Сен 2016 в 10:09