我正在使用Laravel:5.7,MS-SQL:2012。
要在MS SQL上运行-> get()之前进行自定义“订购依据”
我的代码如下:
$MonthOrder = implode(',', ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']);
$listData->orderByRaw(DB::raw("FIELD(t2.Month, $MonthOrder) DESC"))
我收到此错误:
SQL:
select * from [dbo].[EXT_Data_DESC_Gamingdatas] as [t2]
inner join (
select MAX(id) AS id, [Year], [Month], MAX(updated_at
) AS updated_at
from [EXT_Data_DESC_Gamingdatas] group by [Year], [Month]
)
max_table on [max_table].[id] = [t2].[id] and [max_table].[updated_at] = [t2].[updated_at]
order by [t2].[Year] desc, FIELD(t2.Month, Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec) DESC)
SQLSTATE [42000]:[Microsoft] [SQL Server的ODBC驱动程序11] [SQL 服务器]“ FIELD”不是公认的内置函数名称
。
如何解决此问题?我找不到合适的答案...
答案 0 :(得分:1)
field
是MySQL函数。 SQL Server没有它。
您可以改用CASE
表达式。
...
CASE
WHEN t2.month = 'Jan' THEN
1
WHEN t2.month = 'Feb' THEN
2
...
END
...
或更改架构并使用不同类型存储数据。如果可能的话,日期/时间类型或月份中的至少某种数字类型。
答案 1 :(得分:0)
感谢@sticky 我通过在此列中添加case when和order来解决自定义订单
DB::raw("(
CASE
WHEN (Month = 'Jan') THEN 1
WHEN (Month = 'Feb') THEN 2
WHEN (Month = 'Mar') THEN 3
WHEN (Month = 'Apr') THEN 4
WHEN (Month = 'May') THEN 5
WHEN (Month = 'Jun') THEN 6
WHEN (Month = 'Jul') THEN 7
WHEN (Month = 'Aug') THEN 8
WHEN (Month = 'Sep') THEN 9
WHEN (Month = 'Oct') THEN 10
WHEN (Month = 'Nov') THEN 11
WHEN (Month = 'Dec') THEN 12
END
) as MonthOrder"),