编辑器中的 ms-access VBA 长 sql 查询字符串行拆分(内联双引号)
Posted
技术标签:
【中文标题】编辑器中的 ms-access VBA 长 sql 查询字符串行拆分(内联双引号)【英文标题】:ms-access VBA long sql query string line split ( with double quote inline) in editor 【发布时间】:2015-05-14 13:13:16 【问题描述】:我在 MS-Access 2010 中有一个下面的 sql 查询,它在查询设计窗口中运行良好。现在我想通过 VBA 对其进行编码。
实际查询:
INSERT INTO MAINRESULT(EXNAME, MASTER_TICKER,MASTER_CUSIP,TL_TICKER,TL_CUSIP,FC_CUSIP,FC_TICKER)
SELECT EXC AS MY_EXC,
SUM(IIF(MASTER_TICKER <> "NULL", 1, 0)) AS MY_MASTER_TICKER,
SUM(IIF(MASTER_CUSIP <> "NULL", 1, 0)) AS MY_MASTER_CUSIP,
SUM(IIF(TL_TICKER <> "NULL", 1, 0)) AS MY_TL_TICKER,
SUM(IIF(TL_CUSIP <> "NULL", 1, 0)) AS MY_TL_CUSIP,
SUM(IIF(FC_CUSIP <> "NULL", 1, 0)) AS MY_FC_CUSIP,
SUM(IIF(FC_TICKER <> "NULL", 1, 0)) AS MY_FC_TICKER
FROM TESTDATA
GROUP BY EXC;
我的 VBA 代码 sn-p:
Dim strSQL As String
Dim db As Database
Set db = CurrentDb
strSQL = "INSERT INTO MAINRESULT(EXNAME, MASTER_TICKER,MASTER_CUSIP,TL_TICKER,TL_CUSIP,FC_CUSIP,FC_TICKER) " & _
"SELECT EXC AS MY_EXC, " & _
"SUM(IIF(MASTER_TICKER <> "NULL", 1, 0)) AS MY_MASTER_TICKER, " & _
"SUM(IIF(MASTER_CUSIP <> "NULL", 1, 0)) AS MY_MASTER_CUSIP, " & _
"SUM(IIF(TL_TICKER <> "NULL", 1, 0)) AS MY_TL_TICKER, " & _
"SUM(IIF(TL_CUSIP <> "NULL", 1, 0)) AS MY_TL_CUSIP, " & _
"SUM(IIF(FC_CUSIP <> "NULL", 1, 0)) AS MY_FC_CUSIP, " & _
"SUM(IIf(FC_TICKER <> "NULL", 1, 0)) As MY_FC_TICKER " & _
"FROM TESTDATA GROUP BY EXC;"
DoCmd.RunSQL strSQL
不幸的是,由于编辑器中的“NULL”内容而出现错误,并且始终显示为红色。还有其他替代方法吗?因为这些列名也将动态来自选择列表框,所以我必须以参数化的方式创建这个 strSQL。
【问题讨论】:
现在我已经手动将整个内容放在一行中,但它仍然在“NULL”附近给出“编译错误:预期语句结束” 所有字段都有一个值(实际文本说)“NULL”还是它们为 Null - NULL?记住 Null "NULL"。 现在我尝试过像这样使用 ""NULL"" 但仍然无法正常工作... @PaulFrancis,是的,不幸的是,这些字段值本身是“NULL”,用一些东西替换它不是很舒服的主意.. 【参考方案1】:您似乎将 NULL 作为值混淆了,Null 是无法比较的东西。您可以使用两种变体。一种是,
Dim strSQL As String
Dim db As Database
Set db = CurrentDb
strSQL = "INSERT INTO MAINRESULT(EXNAME, MASTER_TICKER,MASTER_CUSIP,TL_TICKER,TL_CUSIP,FC_CUSIP,FC_TICKER) " & _
"SELECT EXC AS MY_EXC, " & _
"SUM(IIF(MASTER_TICKER Is Not Null, 1, 0)) AS MY_MASTER_TICKER, " & _
"SUM(IIF(MASTER_CUSIP Is Not Null, 1, 0)) AS MY_MASTER_CUSIP, " & _
"SUM(IIF(TL_TICKER Is Not Null, 1, 0)) AS MY_TL_TICKER, " & _
"SUM(IIF(TL_CUSIP Is Not Null, 1, 0)) AS MY_TL_CUSIP, " & _
"SUM(IIF(FC_CUSIP Is Not Null, 1, 0)) AS MY_FC_CUSIP, " & _
"SUM(IIf(FC_TICKER Is Not Null, 1, 0)) As MY_FC_TICKER " & _
"FROM TESTDATA GROUP BY EXC;"
DoCmd.RunSQL strSQL
或者您可以使用 IsNull 函数。
如果该值实际上是一个字符串“NULL”,那么您应该使用字符串文字进行比较。 <> 'NULL'
。
编辑
试试下面的,
Dim strSQL As String
Dim db As Database
Set db = CurrentDb
strSQL = "INSERT INTO MAINRESULT(EXNAME, MASTER_TICKER,MASTER_CUSIP,TL_TICKER,TL_CUSIP,FC_CUSIP,FC_TICKER) " & _
"SELECT EXC AS MY_EXC, " & _
"SUM(IIF(MASTER_TICKER <> 'NULL', 1, 0)) AS MY_MASTER_TICKER, " & _
"SUM(IIF(MASTER_CUSIP <> 'NULL', 1, 0)) AS MY_MASTER_CUSIP, " & _
"SUM(IIF(TL_TICKER <> 'NULL', 1, 0)) AS MY_TL_TICKER, " & _
"SUM(IIF(TL_CUSIP <> 'NULL', 1, 0)) AS MY_TL_CUSIP, " & _
"SUM(IIF(FC_CUSIP <> 'NULL', 1, 0)) AS MY_FC_CUSIP, " & _
"SUM(IIf(FC_TICKER <> 'NULL', 1, 0)) As MY_FC_TICKER " & _
"FROM TESTDATA GROUP BY EXC;"
DoCmd.RunSQL strSQL
【讨论】:
我的建议是让 OP 受益于怀疑 - 但这是一个完全有效的观点。 @HansUp,后端可能是 MSSQL,其中 NULL 实际上显示为一个值(肉眼),这可能导致 OP相信将它与“NULL”作为字符串进行比较会起作用吗?我们知道vbNullString <> "Null"
会通过测试。这只是在黑暗中刺伤。但我明白你的意思。
@PaulFrancis 不幸的是 Is Not Null 的结果与预期计数不匹配...我对 NULL 作为值并不感到困惑,但在这种特定情况下,这些字段包含文字字符串“NULL”我需要在计数时绕过,这很痛苦.....现在我可以得到任何解决方案
@PaulFrancis... IsNull 在这种情况下也会给出语法错误...所以需要其他方式
@PaulFrancis... 有没有办法在查询设计窗口中动态传递查询,然后获得所需的结果。 HansUp 的最后一种方法在查询窗口中给出了正确的结果,但不能通过 VBA 工作【参考方案2】:
最后它通过使用 chr$(39) 方式完美地工作:
Dim MYSTR As String
MYSTR = "NULL"
'teststrSQL = "SELECT EXC,FC_CUSIP FROM TESTDATA " & _
"WHERE FC_CUSIP = " & Chr$(39) & MYSTR & Chr$(39)
finalstrSQL = "SELECT EXC AS MY_EXC, " & _
"SUM(IIF(MASTER_CUSIP <> " & Chr$(39) & MYSTR & Chr$(39) & " , 1, 0)) AS MY_MASTER_CUSIP, " & _
"SUM(IIF(MASTER_TICKER <> " & Chr$(39) & MYSTR & Chr$(39) & " , 1, 0)) AS MY_MASTER_TICKER, " & _
"SUM(IIF(TL_TICKER <> " & Chr$(39) & MYSTR & Chr$(39) & " , 1, 0)) AS MY_TL_TICKER, " & _
"SUM(IIF(TL_CUSIP <> " & Chr$(39) & MYSTR & Chr$(39) & " , 1, 0)) AS MY_TL_CUSIP, " & _
"SUM(IIF(FC_CUSIP <> " & Chr$(39) & MYSTR & Chr$(39) & " , 1, 0)) AS MY_FC_CUSIP, " & _
"SUM(IIF(FC_TICKER <> " & Chr$(39) & MYSTR & Chr$(39) & " , 1, 0)) AS MY_FC_TICKER " & _
"FROM TESTDATA GROUP BY EXC;"
【讨论】:
【参考方案3】:你必须使用 ' 而不是 "
【讨论】:
一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。 (该帖子至少被一位用户标记,大概是因为他们认为应该删除没有解释的答案。)以上是关于编辑器中的 ms-access VBA 长 sql 查询字符串行拆分(内联双引号)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用sql语句和vba将数据从MS-Access导入excel power查询?
如何通过 MS-Access VBA 中的 TextBox.OnKeyUp 属性传递 KeyCode