【发布时间】: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
上面的查询返回一个有效的记录。
我的问题是,我怎样才能得到分数并包含函数来处理传入的参数而不是使用硬编码的字符串?
【问题讨论】:
-
您的代码中有
param1和param2。您是否为两者传递相同的字符串? -
@GordonLinoff 是的,即使我将
param2替换为param1以确保传递相同的字符串,结果集也是空的。 -
CHAR等价于CHAR(1),因此您的所有输入值都会被截断。转换时使用实际的数据类型。 -
谢谢!那行得通。我将 CHAR 更改为 CHAR(50) 并且成功了!
-
如果
param3被定义为CHAR与VARCHAR相比,另一件可能会咬你的事情是,CHAR(10) 字段中的CHAR' variable is always the defined length, andc pads on the left with blanks. So if you put%68046%`,它是就好像您使用了'%68046% '并且只会找到pstcod包含 68046and末尾有三个空格的行。
标签: sql db2 ibm-midrange