【问题标题】:ORDER BY query throwing errorORDER BY 查询抛出错误
【发布时间】:2017-03-11 14:27:25
【问题描述】:

我正在使用 SQL Server 数据库,并选择记录来显示合同信息。协议可以处于活动状态、非活动状态、等待响应或等待付款。

我的用户希望网格按以下顺序显示结果:

  • 等待回复
  • 等待付款
  • 过期
  • 活动
  • 无效

我正在尝试使用以下代码来实现这一点,但它会在单词 default 附近抛出一个错误,提示语法错误。

order by 语句有什么问题?

Try
    sql = "SELECT ContractID, CustAcc, DateStart, DateRenew, Fee, Agreement, OtherDetails, " _
        & "DateSent, TimeSent, ReminderName, ReminderEmail FROM dbo.tblContracts " _
        & "ORDER BY FIELD(Agreement, 'AWAITING RESPONSE', 'AWAITING PAYMENT', 'ACTIVE', 'INACTIVE')"
    conAd = New OleDb.OleDbDataAdapter(sql, con)
    conset = New DataSet
    conAd.Fill(conset)
    ugModules.DataSource = conset
Catch ex As Exception
    errorLog(ex.Message, ex.StackTrace)
    MsgBox("Failed to retrieve contract information, refer to error log")
End Try

编辑

根据@Solarflare 的建议更改我的代码后,我现在得到了以下代码;

sql = "SELECT ContractID, CustAcc, DateStart, DateRenew, Fee, Agreement, OtherDetails, " _
& "DateSent, TimeSent, ReminderName, ReminderEmail FROM dbo.tblContracts " _ 
& "ORDER BY CASE Agreement WHEN 'AWAITING RESPONSE' THEN 1 WHEN 'AWAITING PAYMENT' THEN 2 " _
& "WHEN 'OVERDUE' THEN 3 WHEN 'ACTIVE' THEN 4 WHEN 'INACTIVE' THEN 5 END"

但是,结果却不如预期。结果如下

所以 INACTIVE 主要位于顶部,其次是 AWAITING RESPONSE 和 INACTIVE 等 - 为什么会这样?

【问题讨论】:

  • 什么类型的SQL?
  • Agreement 是什么数据类型?看起来您正在尝试将其(或其他内容)翻译为该文本?还。 SQL中没有“默认”,因此不清楚错误实际上来自那个sn-p
  • 这看起来像您正在尝试在 mssql 服务器上使用 mysql 函数。看看What is the MS SQL Server capability similar to the MySQL FIELD() function?
  • ORDER BY FIELD1, Filed2, ..... field_N
  • @Plutonix 它是 SQL 中的 nvarchar(255) 数据类型

标签: sql vb.net sql-order-by


【解决方案1】:

ORDER BY 应该使用 SQL Server 中的 CASE 语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-22
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2016-04-27
    • 2018-08-03
    相关资源
    最近更新 更多