插入 CASE 函数时 SQL 代码不会运行?

Posted

技术标签:

【中文标题】插入 CASE 函数时 SQL 代码不会运行?【英文标题】:SQL code won't run when CASE function is inserted? 【发布时间】:2021-12-30 19:38:13 【问题描述】:

我正在尝试将 CASE 函数放入一些 SQL 代码中,但无法使其运行。在 CASE 函数之前,一切都运行良好,每当插入该函数时,都会出现调试错误。我在制作这个程序时得到了帮助,所以我希望这只是一个我不知道的简单错误。这是根据满足条件从 2 个大型 Excel 表中提取选择内容。 CASE 函数确定一个值是 > 还是

见下面的代码:

Dim fPath As String
    Dim oConn As New ADODB.Connection
    Dim oRS As New ADODB.Recordset
    Dim sPath As String, rng1 As Range, rng2 As Range, SQL As String
    
    fPath = ThisWorkbook.FullName 'workbook must be saved somewhere...
    
    'connect to the workbook on disk
    oConn.Open "Driver=Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb);" & _
               "DBQ=" & fPath & ";"
       
    'select some records which match between lists (zipccode and subdivision)
    '   and with the entered criteria (price, SQFT)
    SQL = " select n.*, o.* from  [OldList$] o, [NewList$] n " & _
          " where n.zipcode = o.zipcode and left(n.Subdivision, 6) = left(o.Subdivision, 6)" & _
          " and (n.listprice - o.listprice) between " & shtCriteria.Range("C4").Value & " and " & shtCriteria.Range("D4").Value & _
          " and (n.sqft - o.sqft) between " & shtCriteria.Range("C6").Value & " and " & shtCriteria.Range("D6").Value & _
          " and CASE " & _
          "         WHEN n.lot > 12000 " & _
          "             THEN o.lot between n.lot + n.lot* " & shtCriteria.Range("C8").Value & " and n.lot + n.lot* " & shtCriteria.Range("D8").Value & " " & _
          "         ELSE (n.lot - o.lot) between " & shtCriteria.Range("C9").Value & " and " & shtCriteria.Range("D9").Value & _
          "     END "
        

            
    Set oRS = oConn.Execute(SQL) 'run the query

【问题讨论】:

Case 不是一个函数,它是一个表达式。您的案例表达式格式不正确,您需要查看特定 RDBMS 的文档。理想情况下,编辑您的问题以包含 actual SQL 语句,而不是动态构造它的代码。并查看Bad habbits to kick 改用括号和 AND/OR 逻辑运算符? 还考虑使用参数(以及 SQL 中的 ? 占位符)而不是连接未经验证的输入(如果单元格包含意外值、错误或..一些 SQL 语句怎么办?);您将调用 ADODB.Command 实例的 Execute 方法,而不是直接关闭连接。 谢谢大家,我试试看。仍在尝试在这里学习基础知识。欣赏它 【参考方案1】:

CASE 根据条件返回相同类型的不同结果。它不是用于执行您尝试的替代代码块。

删除CASE 并使用ORAND

你是这样使用它的:

WHERE …
AND CASE
      WHEN n.lot > 12000
        THEN <condition 1>
      ELSE <condition 2>
    END

改成:

WHERE …
AND (
    (n.lot > 12000 AND <condition 1>)
    OR
    (n.lot <= 12000 AND <condition 2>)
)

【讨论】:

谢谢,我试试看

以上是关于插入 CASE 函数时 SQL 代码不会运行?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:使用case插入两个表

Postgres 错误:CASE 中不允许设置返回函数

SQL Date 函数

SQL Date 函数

SQL Date 函数

sql日期