【问题标题】:How do I search for a value in an integer table using LIKE and <cfqueryparam>?如何使用 LIKE 和 <cfqueryparam> 在整数表中搜索值?
【发布时间】:2011-09-22 15:47:17
【问题描述】:

我有一个类似的查询:

选择项目ID FROM 项目表 WHERE itemID LIKE '%123%'

itemTable 是 INT 类型。这个查询本身就可以正常工作,因为它会选择“12345”和“0912398”等等......

当我尝试使用时出现问题

假设 var searchValue = 123

如果我尝试:&lt;cfqueryparam cfsqltype='cf_sql_integer' value="'%#searchValue#%'" &gt;
我得到 *CFSQLTYPE CF_SQL_INTEGER 的无效数据“123”。*

如果我尝试:&lt;cfqueryparam cfsqltype='cf_sql_varchar' value="'%#searchValue#%'" &gt;
我得到 java.lang.Integer 无法转换为 java.lang.String

我尝试在我的 SQL 中使用 CAST,并在不同的地方使用 toString(searchValue),但我总是以上面的错误消息之一结束。有没有办法使用 CFQUERYPARAM 搜索和整数表?

编辑:下面是我尝试使用的实际代码...

CFSCRIPT 代码:

var searchValue=123;
searchFilterQuery(qry=qItemResults, field="itemID", value=searchValue,cfsqltype="cf_sql_varchar");

CFC 功能:

<!--- FILTER A QUERY WITH SEARCH TERM --->
<cffunction name="searchFilterQuery" access="public" returntype="query" hint="Filters a query by the given value" output="false">
    <!--- ************************************************************* --->
    <cfargument name="qry"          type="query"    required="true" hint="Query to filter">
    <cfargument name="field"        type="string"   required="true" hint="Field to filter on">
    <cfargument name="value"        type="string"   required="true" hint="Value to filter on">
    <cfargument name="cfsqltype"    type="string"   required="false" default="cf_sql_varchar" hint="The cf sql type of the value.">
    <!--- ************************************************************* --->
    <cfset var qryNew = QueryNew("")>
    <cfquery name="qryNew" dbtype="query">
        SELECT *
            FROM arguments.qry
            WHERE #trim(arguments.field)# LIKE <cfqueryparam cfsqltype="#trim(arguments.cfsqltype)#" value="#trim(arguments.value)#">
    </cfquery>
    <cfreturn qryNew>
</cffunction>

【问题讨论】:

  • RE: I get *Invalid data '123' for CFSQLTYPE CF_SQL_INTEGER.* .. 这是因为 CF 期望您的 value 是有效的 integer,例如 123212。但是您实际上传递的是文字字符串:'%123%'。显然不是整数。因此出现错误。

标签: sql tsql coldfusion


【解决方案1】:

我认为你需要这样做:

  • 删除人们所说的引号

  • 使用 VARCHAR 参数,而不是 INTEGER,因为 % 符号使您传递的值不是 INTEGER

  • 在数据库方面将整数列转换为 VARCHAR。数据库可能会自动为您执行此操作,但我认为最好明确说明这些事情。

    选择项目 ID FROM 项目表 WHERE CAST(itemId AS VARCHAR) LIKE

【讨论】:

  • 是的。 CAST(#trim(arguments.field)# as varchar) 工作得很好。它以为我以前尝试过 CAST,但我一定是语法错误,或者留下了引号之类的东西。感谢亚当和其他所有人!
【解决方案2】:

如果你把你的撇号从使用 varchar 的那个上去掉,那会起作用。

【讨论】:

  • 不应该在任何一个中使用单引号。如果需要,DBMS 将负责添加引号。使用 cfqueryparam 时,您永远不需要在值中添加引号
  • 你说得对,我正准备把我的答案填上一点。基本上,您现在将撇号作为您价值的一部分传递。
  • 从 varchar 语句中取出撇号会导致同样的错误:“java.lang.Integer cannot be cast to java.lang.String” 使用 cf_sql_integer 从语句中删除撇号会得到:“遇到“itemID LIKE 123。条件表达式不正确,应为 [like|null|between|in|comparison] 条件之一,”
  • @eterps - 这是 QoQ 吗?如果是这样,您可能需要一个明确的cast。您可以发布您的 +exact+ 查询和 CF 版本吗?
  • 将它与 cf_sql_varchar 一起使用,看看会发生什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 2019-08-24
相关资源
最近更新 更多