【问题标题】:DB2 Query Functions Not Working With ParametersDB2 查询函数不使用参数
【发布时间】:2017-02-22 17:27:41
【问题描述】:

我有一个无法在 DB2/AS400 中工作的查询。

select integer(score(ADRLIN1, :param1)*100) as RELEVANCEADR, 
ADRLIN1, PSTCOD from MYSCHEMA.MYTABLE 
where contains(ADRLIN1, :param2) = 1
and pstcod like :param3 
order by RELEVANCEADR desc

当我尝试运行上面的查询并在参数中输入值时,我得到 [SQL0418] Use of parameter marker not valid。

这不是什么大问题。谷歌搜索告诉我在使用它们之前 CAST 参数。那么我将查询更改为:

select integer(score(ADRLIN1, CAST(:param1 AS CHAR))*100) as RELEVANCEADR, 
ADRLIN1, PSTCOD from MYSCHEMA.MYTABLE  
where contains(ADRLIN1, CAST(:param2 AS CHAR)) = 1
and pstcod like :param3 order by RELEVANCEADR desc

具有以下值:

  • param1 --> 19 EDGEWOOD BLVD
  • param2 --> 19 EDGEWOOD BLVD
  • param3 --> %68046%

我得到一个空的结果集。 但是,如果我真的用文字填写查询,查询就可以了。

select integer(score(ADRLIN1, '19 EDGEWOOD BLVD')*100) as RELEVANCEADR, 
ADRLIN1, PSTCOD from MYSCHEMA.MYTABLE
where contains(ADRLIN1, '19 EDGEWOOD BLVD') = 1
and pstcod like '%68046%' 
order by RELEVANCEADR desc

上面的查询返回一个有效的记录。

我的问题是,我怎样才能得到分数并包含函数来处理传入的参数而不是使用硬编码的字符串?

【问题讨论】:

  • 您的代码中有param1param2。您是否为两者传递相同的字符串?
  • @GordonLinoff 是的,即使我将param2 替换为param1 以确保传递相同的字符串,结果集也是空的。
  • CHAR 等价于CHAR(1),因此您的所有输入值都会被截断。转换时使用实际的数据类型。
  • 谢谢!那行得通。我将 CHAR 更改为 CHAR(50) 并且成功了!
  • 如果param3 被定义为CHARVARCHAR 相比,另一件可能会咬你的事情是,CHAR(10) 字段中的CHAR' variable is always the defined length, andc pads on the left with blanks. So if you put %68046%`,它是就好像您使用了 '%68046% ' 并且只会找到 pstcod 包含 68046 and 末尾有三个空格的行。

标签: sql db2 ibm-midrange


【解决方案1】:

正如@Mustaccio 在 cmets 中指出的那样,转换为 CHAR 等同于 CHAR(1)。我更正了这一点以声明实际长度并且查询正在运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多