我有火鳥2.5.2表:火鳥位置意外的行爲?
create table SearchTest (val varchar(20))
其中有兩行:
insert into SearchTest (val) values ('one')
insert into SearchTest (val) values ('three')
我想選擇其中列「VAL」包含任何「一」或所有行「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
這是爲什麼,有沒有辦法解決這個問題?
編輯:
吉日Cincura已經注意到這個錯誤是固定的下一個版本;字符串常量現在顯式轉換爲varchars。火鳥跟蹤問題:http://tracker.firebirdsql.org/browse/DNET-466
爲什麼不使用SIMILAR TO運算符? –
什麼是Firebird版本?乍一看,這看起來像一個錯誤,所以你可能還想在http://tracker.firebirdsql.org/browse/CORE –