J'ai une table dans Firebird 2.5.2:Firebird POSITION comportement inattendu?
create table SearchTest (val varchar(20))
qui a deux lignes:
insert into SearchTest (val) values ('one')
insert into SearchTest (val) values ('three')
Je veux sélectionner toutes les lignes où la colonne 'val' contient soit 'un' ou « hre '. LINQ je peux exprimer ce que:
var a = from b in TestEntities.SEARCHTESTs
from c in new []{ "one", "hre" }
where b.VAL.Contains(c)
select b;
Cela génère une requête comme ceci:
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)
Pour faciliter l'inspection bien, cela fait la même chose:
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
)
Utilisation de la termes de recherche 'un' et 'hre', le résultat est comme vous pouvez l'attendre:
val substr pos
--- ------ ---
one one 1
three one 0
one hre 0
three hre 2
Cependant, si les longueurs des termes de recherche ne correspondent pas:
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
)
Le match échoue:
val substr pos
--- ------ ---
one one 1
three one 0
one hree 0
three hree 0
Si je jetai les termes de recherche (les types de fonte ne doivent pas correspondre, comme montré ici):
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
)
Le match fonctionne à nouveau:
val substr pos
--- ------ ---
one one 1
three one 0
one hree 0
three hree 2
Pourquoi est-ce, et y a-t-il un moyen de contourner le problème?
Edit:
Jiri Cincura a noté que ce bug est corrigé pour la prochaine version; Les constantes de chaîne sont maintenant converties en varchar explicitement. problème Firebird tracker: http://tracker.firebirdsql.org/browse/DNET-466
Pourquoi n'utilisez-vous pas l'opérateur SIMILAR TO? –
Qu'est-ce que la version Firebird? À première vue, cela ressemble à un bug, donc vous pourriez aussi vouloir créer un ticket de bug sur http://tracker.firebirdsql.org/browse/CORE –