09. november 2009 - 15:34
Der er
1 løsning
søgning vha. CONTAINS() med dynamiske keywords
hej håber der er en der kan hjælpe mig.
jeg har 3 tabeller.
tabellerne ser ud på flg måde:
tabel_1:
id (NUMBER 8,0)
name (VARCHAR 40)
comment (CLOB)
tabel_2:
id (NUMBER 8,0)
name (VARCHAR 40)
comment (CLOB)
tabel_1_keywords:
id (NUMBER 8,0)
tabel_1_id (NUMBER 8,0)
keyword (VARCHAR 20)
meningen er at jeg skal søge i tabel 2 efter de keywords der passer til en given række i tabel 1.
dette eksempel virker:
SELECT SCORE(1) score, t2.id, t2.name
FROM table_2 t2
WHERE CONTAINS(t2.name, 'ord1 AND ord2', 1) > 0
ORDER BY SCORE(1) DESC;
jeg kan bare ikke få den næste query til at virke. Jeg kan godt forstå hvorfor den ikke virker, bare ikke hvordan jeg skal redde den:
SELECT SCORE(1) score, t1.name, t2.id, t2.name
FROM table_2 t2, table_1 t1, tabel_1_keywords kw
WHERE CONTAINS(t2.name, kw.keyword, 1) > 0
AND kw.tabel_1_id = t1.id
AND t1.id = :id
ORDER BY SCORE(1) DESC;
tak på forhånd.
09. november 2009 - 16:20
#1
fik det løst, men kan ikke overskue at skrive det om til test tabeller, så her er den min query i en list anden form:
SELECT SCORE(1) score, cp.name, cp.chainid
FROM competitorproduct cp
WHERE CONTAINS(
cp.name, (SELECT IMPLODE(CURSOR(
SELECT kw.keyword
FROM masterproduct mp, masterproduct_keyword kw
WHERE (
kw.chainid = :chainid
OR kw.chainid IS NULL
)
AND kw.sku = :sku
GROUP BY kw.keyword), ' ACCUM '
)
FROM DUAL), 1
) > 0
GROUP BY SCORE(1), cp.name, cp.chainid
ORDER BY SCORE(1) DESC;
der skal bruges in funktion til dette:
CREATE OR REPLACE FUNCTION IMPLODE
(
p_cursor SYS_REFCURSOR,
p_delimiter VARCHAR2 := ','
)
RETURN
VARCHAR2
AS
v_token VARCHAR2(32767);
v_output VARCHAR2(32767);
BEGIN
LOOP
FETCH p_cursor INTO v_token;
EXIT WHEN p_cursor%NOTFOUND;
IF v_output IS NOT NULL THEN
v_output := v_output || p_delimiter;
END IF;
v_output := v_output || v_token;
END LOOP;
RETURN v_output;
END IMPLODE;