所有字段都是可选字段时更新查询

时间:2012-06-18 17:21:59

标签: sql coldfusion

我有一个表需要更新,其中所有列都可以选择传递给方法。

然后我使用ColdFusion检查每个列是否已通过并将其添加到更新查询中。

最好的方法是什么?我不能总是更新user_id字段,因为它是一个标识字段。是否有类似于设置1 = 1的东西,就像我在下面那样可以工作?问题只在于逗号导致语法错误。

感谢您的帮助。

update users
set 1 = 1
    <cfif len(arguments.userType)>,user_type = #arguments.userType#</cfif>
    <cfif len(arguments.primaryGroupId)>,primary_group_id = #arguments.primaryGroupId#</cfif>
    <cfif len(arguments.email)>,email = '#arguments.email#'</cfif>
    <cfif len(arguments.password)>,password = '#arguments.password#'</cfif>
    <cfif len(arguments.firstName)>,first_name = '#arguments.firstName#'</cfif>
    <cfif len(arguments.lastName)>,last_name = '#arguments.lastName#'</cfif>
    <cfif len(arguments.status)>,status = '#arguments.status#'</cfif>
    <cfif len(arguments.languageId)>,language_id = #arguments.languageId#</cfif>
    <cfif len(arguments.gmtOffset)>,gmt_offset = '#arguments.gmtOffset#'</cfif>
where user_id = #arguments.userId#

3 个答案:

答案 0 :(得分:4)

如果您正在更新,并且未传递参数,则只需将其设置为当前值。

update users
set
    user_type = <cfif len(arguments.user_type)>#arguments.userType#<cfelse>user_type</cfif>
    ,primary_group_id = <cfif len(arguments.primaryGroupId)>#arguments.primaryGroupId#<cfelse>primary_group_id</cfif>
    ,email = <cfif len(arguments.email)>'#arguments.email#'<cfelse>email</cfif>
where user_id = #arguments.userId#

答案 1 :(得分:2)

嗯......你可以计算你做的更新次数。这将“修复”上面的查询。如:

<cfset updCt = false/>
<cfif len(arguments.usertype)>, user_type = #arguments.userType# 
    <cfset updCt = true/>
</cfif>
<cfif len(arguments.primaryGroupID)>
  <cfif updCt>,</cfif> 
    primary_group_id = #arguments.primaryGroupID# <cfset updCT = true/>
</cfif>

...你明白了。虽然相当混乱。我想我更有可能确保参数都存在 - 传递未更改的值,以便查询更新整个数据集(或其他)。

答案 2 :(得分:0)

如果您可以将所有参数(除UserID之外)设为可选AND而没有默认值,那么您可以执行以下操作:

<cffunction name="updateUser">
 <cfargument name="userID" required="true">

 <cfset argumentMap = {field1 = {name="field_1", type="cf_sql_varchar"},
                      field2 = {name="field_2", type="cf_sql_numeric"},
                      ....} />
 <!--- where field1, field2, etc will match the name 
       of the arguments to your function--->

 <cfif arrayLen(structKeyArray(arguments)) gt 1>
   <cfquery>
   UPDATE users
     SET
      <cfloop collection="#arguments#" item="arg">
         #argumentMap[arg].name# = <cfqueryparam 
                                       value="#arguments[arg]#"
                                       type="#argumentMap[arg].type#" />
      </cfloop>
     WHERE user_id = <Cfqueryparam value="#arguments.userID#" type="cf_sql_numeric"/>
   </cfquery>
 </cfif>
</cffunction>

这只会执行带有给定参数的UPDATE语句。