単純に列 AZ だった場合、これは簡単な答えです。
SELECT celldata,
SUBSTR(cellposition,1,2) AS column,
SUBSTR(cellposition,2) AS row,
cellposition
FROM mytable
ORDER BY 3,2
「AA」、「AZ」、「BA」などの追加の列がある場合は、列/行を抽出するだけでなく、少し難しくなります。だけでなく、列の順序を処理するために...私はまだその解決策に取り組んでいます。実際にすべてを記述せずに、数値の cellposition テストの 2 番目、3 番目、4 番目の文字で CASE テストを行い、それに応じて SUBSTR オフセットと長さを調整して行と列のコンポーネントを分割し、LPAD を使用します。 () を使用して、3 文字の長さになるまで列にスペースを埋め込みます。
MySQL を拡張できる場合、LIB_MYSQLUDF_PREGは追加の PREG_CAPTURE および PREG_POSITION 関数を MySQL に提供し、これを大幅に簡単にします。ただし、これを行うにはソースから MySQL を再コンパイルする必要があります。MySQL 開発者は、これを標準として実装することを検討する必要があります。
PHP では、任意の順序でレコードを取得してから、PHP で usort() を実行し、次のような方法で分割を処理できるため、実際にははるかに簡単です。
list($c,$r) = sscanf($coord,'%[A-Z]%d');
$c = str_pad($c, 3, ' ', STR_PAD_LEFT);
行/列を分割し、列をパディングして同等の文字列に調整します。しかし、大量のデータを処理している場合、これは非常にメモリを消費する可能性があります。
セルアドレスをキーにした配列を使用し、値をセル値として使用したため、次のようになります。
function cellAddressCompare($a, $b)
{
sscanf($a,'%[A-Z]%d', $ac, $ar);
sscanf($b,'%[A-Z]%d', $bc, $br);
if ($ar == $br) {
return strcasecmp(strlen($ac) . $ac, strlen($bc) . $bc);
}
return ($ar < $br) ? -1 : 1;
}
uksort ($testArray, 'cellAddressCompare');