我使用的是Firebird 2.5,我必须找到包含几个单词的行,以任何顺序:
查找'blue' and 'house':
'a blue house in the woods' = true"有蓝色窗户的房子"=真的"海边的房子"=假的'the blue car' = true
使用管道"|"给我OR,我需要and,但在任何顺序,不仅仅是2个单词,可以更多我正在尝试使用类似的,但似乎在火鸟RegExpr太有限。
使用几个LIKE x AND LIKE y,不是你的方式,因为我不知道要找到多少单词
您只能使用Firebird方法来解决您的任务。假设有一个名为TEST的表,只有一个字段s。
CREATE TABLE TEST (S VARCHAR(256))
包含短语:
'a blue house in the woods'
'a house with blue windows'
'a house by the beach'
'the blue car'
...
你需要创建一个辅助的可选择过程SPLIT_WORDS:
CREATE OR ALTER PROCEDURE split_words (S VARCHAR(256))
RETURNS(
K VARCHAR(256),
W VARCHAR(256))
AS
DECLARE VARIABLE B INTEGER = 1;
DECLARE VARIABLE E INTEGER = 1;
DECLARE VARIABLE C CHAR(1);
BEGIN
K = :S;
WHILE (:E <= CHAR_LENGTH(:S)) DO
BEGIN
C = UPPER(SUBSTRING(:S FROM :E FOR 1));
IF (:C < 'A' OR :C > 'Z') THEN
BEGIN
W = SUBSTRING(:S FROM :B FOR (:E - :B));
IF (:W > '') THEN
SUSPEND;
WHILE (:E <= CHAR_LENGTH(:S)) DO
BEGIN
C = UPPER(SUBSTRING(:S FROM :E FOR 1));
IF (:C >= 'A' AND :C <= 'Z') THEN
LEAVE;
E = :E + 1;
END
B = :E;
END
E = :E + 1;
END
W = SUBSTRING(:S FROM :B FOR (:E - :B));
IF (:W > '') THEN
SUSPEND;
END
将给定字符串拆分为单词的过程。任何非字母字符都被视为分隔符。
有了这个过程,我们可以编写一个查询,它将以任何顺序返回包含'HOUSE'和'BLUE'的所有字符串。
SELECT
tt.s
FROM
test tt JOIN
(SELECT
t.s, COUNT(s2.w) c
FROM
test t LEFT JOIN split_words(t.s) s ON 1=1
LEFT JOIN split_words('blue house') s2 ON s.w=s2.w
WHERE
s2.w IS NOT NULL
GROUP BY
1
) ttt ON ttt.s = tt.s
WHERE
ttt.c = (SELECT COUNT(*) FROM split_words('blue house'))
据我所知,firebird没有任何内置的东西可以帮助您。
你真正需要的是全文搜索。虽然firebird不直接支持这一点,但这里有一些有用的建议:http://www.firebirdfaq.org/faq328/
祝你好运,对不起,我没有更直接的答案。你可以在参考手册中选择SIMILAR TO,但我认为你更需要像Sphinx这样的东西