Excel列名変換問題 – SQL編

ここにExcel列名変換問題というのがあって、内容は下のようなもの。

問題1: Excel列名変換問題
仕様
入力されたアルファベットを数字に変換する。
変換ルールはExcelの列名と同等。
例) A=1、B=2、Z=26、AA=27、XFD=16384
起動時引数
[0] アルファベット (A~ZZZZ…[上限なし])*2
実行例
ExcelColConv.pl A → 1
ExcelColConv.pl AA → 27

で、SQLで考えてみた。PostgreSQLのバージョン9以降。
(generate_series()が必要なので。MySQLなんかだとピボットテーブルが必要。)
SQL上手い人はもっといい解法をいくらでも思いつくんだろう。
入れ子集合モデルとか眩しすぎる。
自分には一生かかっても思いつきそうにない。

#!/bin/sh

str=$1
SQL="
SELECT SUM(y.num) AS result
  FROM (
    SELECT x.*, __indexes.n * (26 ^ (x.pos - 1)) AS num
      FROM (
        SELECT substr(_chars.chars, _chars.n, 1) AS c, length(_chars.chars) - _chars.n + 1 AS pos
          FROM (
            SELECT generate_series(1, length(chars.chars)) AS n, chars.chars
              FROM (
                SELECT '$str'::text AS chars
                 ) chars
             ) _chars
         ) AS x
      JOIN (
        SELECT _indexes.n, _indexes.c
          FROM (
            SELECT n, chr(indexes.n + 64) as c
              FROM (
                SELECT generate_series(1, 26) AS n
                 ) indexes
             ) AS _indexes
         ) AS __indexes
     USING (c)
     ) y;
"
echo "$SQL" | psql

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)