如果它只是 AZ 列,那么这是一个简单的答案
SELECT celldata,
SUBSTR(cellposition,1,2) AS column,
SUBSTR(cellposition,2) AS row,
cellposition
FROM mytable
ORDER BY 3,2
当您可能有额外的列,如“AA”、“AZ”、“BA”等时,它会变得有点困难......不仅仅是提取列/行;还要处理列排序...我仍在为此寻找解决方案。在没有实际写出来的情况下,我会对单元格位置测试的第 2、3、4 个字符进行 CASE 测试以获取数值,并相应地调整 SUBSTR 偏移量和长度以拆分行和列组件,然后使用 LPAD () 用空格填充列到 3 个字符长度。
如果你可以扩展你的 MySQL,那么LIB_MYSQLUDF_PREG在 MySQL 中提供了额外的 PREG_CAPTURE 和 PREG_POSITION 函数,这将使这更容易;但是您需要从源代码重新编译 MySQL 才能做到这一点。MySQL 开发人员确实应该考虑将其作为标准实现。
在 PHP 中实际上要容易得多,因为您可以简单地以任何顺序检索记录,然后在 PHP 中使用 usort() 并使用以下方法处理那里的拆分:
list($c,$r) = sscanf($coord,'%[A-Z]%d');
$c = str_pad($c, 3, ' ', STR_PAD_LEFT);
拆分 row/col 并通过填充将 col 调整为可比较的字符串;但如果您正在处理大量数据,这可能会非常耗费内存。
我使用了一个以单元格地址为键的数组,并将值作为单元格值,所以:
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');