【问题标题】:SQL Query breaking for some reasonSQL 查询由于某种原因而中断
【发布时间】:2014-03-17 11:28:57
【问题描述】:

请考虑以下图片:

当我在 Coldfusion 中运行以下查询时:

<cfquery datasource="mydb" name="qCoulmnInsert">
INSERT INTO 
simplexresults.contactresults_email_account_summary_devices 
(open_desktop_int,
open_other_int,
open_phone_int,
open_tablet_int,
open_webmail_int,  
<!--- FOR Unique Open --->
unique_webMail_int,
unique_tablet_int,
unique_other_int,
unique_phone_int,
unique_desktop_int,
<!--- FOR DATES --->
startdate_dt,
enddate_dt,
date_dt)

VALUES
<!--- loop through your array --->
<cfloop from="1" to="#arrayLen(cfData)#" index="i">
(
<cfif structKeyExists(cfData[i], "open")>
<cfqueryparam CFSQLTYPE="CF_SQL_INTEGER" value="#cfData[i].open.Desktop#">
<cfelse>
NULL
</cfif> ,
<cfif structKeyExists(cfData[i], "open")>
<cfqueryparam CFSQLTYPE="CF_SQL_INTEGER" value="#cfData[i].open.Other#">
<cfelse>
NULL
</cfif> ,


<cfif structKeyExists(cfData[i], "open")>
<cfqueryparam CFSQLTYPE="CF_SQL_INTEGER" value="#cfData[i].open.Phone#">
<cfelse>
NULL
</cfif> ,

  and so on and so forth ...
                   ....

</cfquery>

我收到以下错误:

 Element OPEN.DESKTOP is undefined in a CFML structure referenced as part of an expression.

The error occurred in C:\myfile.cfm: line 55

53 :              (
54 :               <cfif structKeyExists(cfData[i], "open")>
55 :                 <cfqueryparam CFSQLTYPE="CF_SQL_INTEGER" value="#cfData[i].open.Desktop#">
56 :               <cfelse>
57 :                 NULL

我知道它没有为如下图所示的某些结构定义,但我在&lt;cfelse&gt; 语句中包含了“NULL”来处理这些情况。我在这里做错了吗?请指教。

但是对于定义 OPEN'S 的日期范围,查询运行良好。

正确方法:

<cfif structKeyExists(cfData[i], "open")>
                <cfif  structKeyExists(cfData[i].open,"Desktop")>
                <cfqueryparam CFSQLTYPE="CF_SQL_INTEGER" value="#cfData[i]["open"]["Desktop"]#">
                <cfelse>
                 NULL
                </cfif>
              <cfelse>
                NULL

              </cfif> ,

【问题讨论】:

  • 我不知道如何在coldfusion中做到这一点,但你应该打印出正在生成的最终查询,让我们看看。
  • Damien,在生成 SQL 之前就出错了。这是 ColdFusion 错误,而不是 SQL 错误。
  • 我之前已经讨论过与此类查询相关的问题:stackoverflow.com/questions/21470019/… 谢谢!

标签: mysql coldfusion


【解决方案1】:

您限定“open”在您的 if 语句中可用,但“Desktop”并不总是可用且未包含在限定语句中。换句话说,“桌面”并不总是一个键,但只要定义了“打开”键,您的循环就会始终查找它。

【讨论】:

  • 但我也有 条件。为什么它没有帮助?我应该考虑使用 0 值而不是 NULL 吗?
  • @user3239126:问题不在 cfelse 中。您收到的错误消息表明“DESKTOP”不是结构中的元素。 (您可以在抛出错误的行之前立即对结构进行 cfdump。)正如 Chris Tierney 在他的回答中指出的那样,您正在测试“OPEN”是否是一个元素,但您 不是 i> 在引用之前测试“DESKTOP”是否是“OPEN”结构的一个元素。
  • 是的。仅仅因为 parent 键即open 存在,并不意味着子键即desktopopen 也将存在(desktopopen)。您必须分别测试它们。先测试父键structKeyExists(struct, "parentKeyName"),再测试子键structKeyExists(struct.parentKeyName, "childKeyName")
  • 谢谢李和其他人。有效。我已经用我的答案更新了我的问题。有没有办法像我使用的那样使用比使用 NULL 更好的东西?只是想知道。
  • 如果你想为缺失值插入null,这并不是一个好坏的问题。虽然您可以通过将两个 structKeyExist 调用组合成一个 cfif 来简化代码。
猜你喜欢
  • 2017-08-28
  • 2023-03-16
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
相关资源
最近更新 更多