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