通过 Varchar 列排序甚至可能吗?

Ordering By a Varchar column is that even possible?

我正在使用 Laravel 进行一些 sass 项目,如果我们的房间接受实际数字旁边的(字母),有些交易会落后完成一步 101 - A101 等等

所以 room_number 列数据类型是 int,所以我将它转换为 varchar 没问题,直到现在一切都运行良好。

收到一个新请求,要求我们以特定方式对这些房间进行排序,例如,如果我有房间 101、102、A101、103、B102,它们必须按升序排列为 101、A101、102、B102, 103

下面的屏幕可能会给您一些想要实现的东西

根据屏幕显示,A101 房间必须在 101 房间之后,B102 房间必须在 102 房间之后,依此类推

我尝试了以下方法

Room::where(.....)
->orderByRaw("CAST(room_number as UNSIGNED) ASC")
->get(); 

我也试着在收到后整理收藏

Room::where(.....)
    ->orderByRaw("CAST(room_number as UNSIGNED) ASC")
    ->get()
    ->sortBy('order', SORT_REGULAR, true); 

但是我所有的尝试都是死路一条! 我想对这些房间执行二进制搜索并应用自定义解决方案,但我想我可以先问问也许有人有同样的问题!

您可以使用 REGEXP_REPLACE() 或 REGEXP_SUBSTR() 来提取数值进行排序,这里是如何操作的示例

Room::where(.....)
    ->orderByRaw("REGEXP_REPLACE(room_number, '[^0-9]+', '') ASC")
    ->get();

Room::where(.....)
    ->orderByRaw("REGEXP_SUBSTR(room_number,'[0-9]+') ASC")
    ->get();

注意:如果您需要更多自定义,请考虑使用“ORDER BY 案例 "