Вы можете решить свою задачу только средствами 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'))