「以下について教えてあげよう♪」・・・SQL で

「以下について教えてあげよう♪」 - ...ing logging 3.0 経由、以下について教えてあげよう♪
書いてみた。やっぱり SQL で。

WITH
  Input(id, str) AS (
    SELECT 1, 'Abc012_59F_#012Gh'
  )
, Transform(id, res, input_str) AS (
    SELECT
        id
      , CAST('' AS varchar(max))
      , str
    FROM
        Input
    UNION ALL
    SELECT
        id
      , res
          + CASE
            WHEN LEFT(input_str, 1) = '#'
              THEN input_str
            WHEN LEFT(input_str, 1) LIKE '[0-9]'
              THEN CAST(9 - CAST(LEFT(input_str, 1) AS int) AS char(1))
              ELSE LOWER(LEFT(input_str, 1))
            END
      , CASE LEFT(input_str, 1)
        WHEN '#' THEN ''
                 ELSE SUBSTRING(input_str, 2, LEN(input_str))
        END
    FROM
        Transform
    WHERE
        input_str <> ''
  )
, Result(id, val) AS (
    SELECT
        id
      , res
    FROM
        Transform
    WHERE
        input_str = ''
  )
SELECT
    id
  , val
FROM
    Result
ORDER BY
    id

なんかもういろいろとダメかもしれんね...orz


あ、途中結果はこんな感じ。

id res input_str
1   Abc012_59F_#012Gh
1 a bc012_59F_#012Gh
1 ab c012_59F_#012Gh
1 abc 012_59F_#012Gh
1 abc9 12_59F_#012Gh
1 abc98 2_59F_#012Gh
1 abc987 _59F_#012Gh
1 abc987_ 59F_#012Gh
1 abc987_4 9F_#012Gh
1 abc987_40 F_#012Gh
1 abc987_40f _#012Gh
1 abc987_40f_ #012Gh
1 abc987_40f_#012Gh