我在 Firebird 2.5.2 中有一张桌子:
create table SearchTest ( val varchar(20) )
其中有两行:
insert into SearchTest ( val ) values ('one')
insert into SearchTest ( val ) values ('three')
我想选择列“val”包含“one”或“hre”的所有行。使用 linq 我可以将其表示为:
var a = from b in TestEntities.SEARCHTESTs
from c in new []{ "one", "hre" }
where b.VAL.Contains(c)
select b;
这会生成如下查询:
SELECT
"C"."VAL" AS "VAL"
FROM "SEARCHTEST" AS "C"
CROSS JOIN (SELECT
_UTF8 X'4F4E45' AS "C1"
FROM ( SELECT 1 AS X FROM RDB$DATABASE) AS "D"
UNION ALL
SELECT
_UTF8 X'485245' AS "C1"
FROM ( SELECT 1 AS X FROM RDB$DATABASE) AS "E") AS "F"
WHERE ((POSITION("F"."C1", "C"."VAL")) > 0)
不过,为了便于检查,这也是同样的事情:
SELECT
val,
substr,
POSITION(Substr, Val) as pos
FROM
SearchTest
CROSS JOIN
(
SELECT 'one' AS substr FROM RDB$DATABASE
UNION ALL
SELECT 'hre' AS substr FROM RDB$DATABASE
)
使用搜索词“one”和“hre”,结果如您所料:
val substr pos
--- ------ ---
one one 1
three one 0
one hre 0
three hre 2
但是,如果搜索词的长度不匹配:
SELECT
val,
substr,
POSITION(Substr, Val) as pos
FROM
SearchTest
CROSS JOIN
(
SELECT 'one' AS substr FROM RDB$DATABASE
UNION ALL
SELECT 'hree' AS substr FROM RDB$DATABASE
)
匹配失败:
val substr pos
--- ------ ---
one one 1
three one 0
one hree 0
three hree 0
如果我转换搜索词(转换类型不必匹配,如此处所示):
SELECT
val,
substr,
POSITION(Substr, Val) as pos
FROM
SearchTest
CROSS JOIN
(
SELECT cast('one' as varchar(3)) AS substr FROM RDB$DATABASE
UNION ALL
SELECT cast('hree' as char(5)) AS substr FROM RDB$DATABASE
)
比赛再次进行:
val substr pos
--- ------ ---
one one 1
three one 0
one hree 0
three hree 2
为什么会这样,有没有办法解决它?
编辑:
Jiri Cincura 已经注意到这个错误会在下一个版本中修复;字符串常量现在显式地转换为 varchars。Firebird 跟踪器问题:http ://tracker.firebirdsql.org/browse/DNET-466