TSQL Challenge 21 - Solution By Pavel Krticka



--Pavel_Krticka_tsqlchallenge_21_v3.sql
with data(Id, row1, row2, row3, i, retval) AS (
select
  Id
  ,convert(varchar(max), replace(
    case
      when charindex(char(13) + char(10), ScanNumber) > 0 then
        convert(varchar(max), left(ScanNumber, charindex(char(13) + char(10), ScanNumber)-1))
      else ScanNumber
    end
   , ' ', '.')) as row1
  ,convert(varchar(max), replace(
    case
      when charindex(char(13) + char(10), ScanNumber) > 0 then
        case
          when charindex(char(13) + char(10), ScanNumber, charindex(char(13) + char(10), ScanNumber) + 1) > 0 then
            convert(varchar(max), substring(ScanNumber, charindex(char(13) + char(10), ScanNumber) + 2, charindex(char(13) + char(10), ScanNumber, charindex(char(13) + char(10), ScanNumber) + 1) - charindex(char(13) + char(10), ScanNumber) - 2))
          else
            convert(varchar(max), substring(ScanNumber, charindex(char(13) + char(10), ScanNumber) + 2, datalength(ScanNumber)))
        end
      else ''
    end
   , ' ', '.')) as row2
  ,convert(varchar(max), replace(
    case
      when (charindex(char(13) + char(10), ScanNumber) > 0) and (charindex(char(13) + char(10), ScanNumber, charindex(char(13) + char(10), ScanNumber) + 1) > 0) then
        case
          when charindex(char(13) + char(10), ScanNumber, charindex(char(13) + char(10), ScanNumber, charindex(char(13) + char(10), ScanNumber) + 1) + 1) > 0 then
            convert(varchar(max), substring(ScanNumber, charindex(char(13) + char(10), ScanNumber, charindex(char(13) + char(10), ScanNumber) + 1) + 2, charindex(char(13) + char(10), ScanNumber, charindex(char(13) + char(10), ScanNumber, charindex(char(13) + char(10), ScanNumber) + 1) + 1) - charindex(char(13) + char(10), ScanNumber, charindex(char(13) + char(10), ScanNumber) + 1) - 2))
          else
            convert(varchar(max), substring(ScanNumber, charindex(char(13) + char(10), ScanNumber, charindex(char(13) + char(10), ScanNumber) + 1) + 2, datalength(ScanNumber)))
        end
      else ''
    end
   , ' ', '.')) as row3
  ,0 as i
  ,convert(varchar(max), '') as retval
from @t
where ScanNumber is not null

union all

select -- parse number
Id,
row1,
row2,
row3,
i + 3,
case
  when (substring(row1, 1 + i, 3) = '...') then -- ' ',1,4
    case
      when (substring(row2, 1 + i, 3) = '...') then -- ' '
        case
          when (substring(row3, 1 + i, 3) = '...') then retval + ' '
          else retval + 'X'
        end
      when (substring(row2, 1 + i, 3) = '..|') then -- 1
        case
          when (substring(row3, 1 + i, 3) = '..|') then retval + '1'
          else retval + 'X'
        end
      when (substring(row2, 1 + i, 3) = '|_|') then -- 4
        case
          when (substring(row3, 1 + i, 3) = '..|') then retval + '4'
          else retval + 'X'
        end
      else retval + 'X'
    end
  when (substring(row1, 1 + i, 3) = '._.') then -- 0,2,3,5,6,7,8,9
    case
      when (substring(row2, 1 + i, 3) = '|.|') then -- 0
        case
          when (substring(row3, 1 + i, 3) = '|_|') then retval + '0'
          else retval + 'X'
        end
      when (substring(row2, 1 + i, 3) = '._|') then -- 2,3
        case
          when (substring(row3, 1 + i, 3) = '|_.') then retval + '2'
          when (substring(row3, 1 + i, 3) = '._|') then retval + '3'
          else retval + 'X'
        end
      when (substring(row2, 1 + i, 3) = '|_.') then -- 5,6
        case
          when (substring(row3, 1 + i, 3) = '._|') then retval + '5'
          when (substring(row3, 1 + i, 3) = '|_|') then retval + '6'
          else retval + 'X'
        end
      when (substring(row2, 1 + i, 3) = '..|') then -- 7
        case
          when (substring(row3, 1 + i, 3) = '..|') then retval + '7'
          else retval + 'X'
        end
      when (substring(row2, 1 + i, 3) = '|_|') then -- 8,9
        case
          when (substring(row3, 1 + i, 3) = '|_|') then retval + '8'
          when (substring(row3, 1 + i, 3) = '._|') then retval + '9'
          else retval + 'X'
        end
      else retval + 'X'
    end
  else retval + 'X'
end
from data
where
i < len(row1)
)

-- final result
select Id, retval as Value
from data
where
i >= len(row1)
order by id
OPTION (MAXRECURSION 32767,MAXDOP 1)


Did you find something incorrect/wrong with this solution? Take a few seconds to Report It.

Did you understand how this solution work? If you find it difficult to understand, you can Request an Explanation or you can Write an explanation to help others better understand this solution.