ここに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