通过 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
案例 "
我正在使用 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 案例 "