2010-10-30 13 views
13

Diciamo che ho una tabella con le colonne A, B, C, D e voglio fare una partita in colonna A e CCome abbinare più colonne in una tabella con SQLite FTS3?

vedo che è possibile abbinare una singola colonna o tutto colonna SQLite cioè

- match column A 
select * from table where A match 'cat' 

- match all columns 
select * from table where table match 'cat' 

È possibile abbinare solo le colonne A e C? Altrimenti, come si fa a capirlo?

Grazie per il suggerimento!

risposta

24

Non penso che sia possibile utilizzare più operatori MATCH in una singola query FTS. Utilizza column_name: target_term per cercare più colonne utilizzando una ricerca a testo completo.

SELECT * FROM table WHERE table MATCH 'A:cat OR C:cat' 

http://www.sqlite.org/fts3.html#termprefix

+0

cosa succede se cat contiene 'OR'? come lo sfuggi? – Alex

+0

@Alex FTS ricerca termini interi, non sottostringhe, quindi non è necessario sfuggire a qualcosa come "A: poor OR C: or". E O OR deve essere maiuscolo, i termini sono in minuscolo. http://www.sqlite.org/fts3.html#section_3_1 –

+0

Per qualche strano motivo: SELECT * FROM tabella WHERE tabella MATCH "campo: v.sport 1" mi sta dando risultati diversi da SELECT * FROM table WHERE field MATCH " v.sport 1 ", dato" V.sport 1 "è il mio termine di ricerca. – kroe

-1

È possibile concatenare colonne utilizzando || operatore:

SELECT * FROM table WHERE a || b MATCH 'cat' 

Non sono sicuro sulla funzione partita di SQLite, però, penso che di solito un'eccezione (vedi http://www.sqlite.org/lang_expr.html#match).

+2

No, SQLite doesnt sembrano così, anche se è possibile tornare colonna concatenare cioè selezionare un || b dalla tabella in cui una corrispondenza 'cat' – Unikorn

+0

Qual è la precedenza degli operatori qui? Corrispondenza o ||? Prova alcune parentesi. – MPelletier

+1

, in realtà, ho notato che puoi fare qualcosa del genere: seleziona * dalla tabella in cui la tabella corrisponde a "colA: cat OR colB: cat", ma la performance è orribile come confrontare colA e colB in una colonna e fare una corrispondenza con esso. – Unikorn

7

Invece di specificare a quali colonne abbinare, è possibile specificare l'intera tabella a cui deve corrispondere. Ad esempio:

-- Example schema 
CREATE VIRTUAL TABLE mail USING fts3(subject, body); 

-- Example table population 
INSERT INTO mail(docid, subject, body) VALUES(1, 'software feedback', 'found it too slow'); 
INSERT INTO mail(docid, subject, body) VALUES(2, 'software feedback', 'no feedback'); 
INSERT INTO mail(docid, subject, body) VALUES(3, 'slow lunch order', 'was a software problem'); 

-- Example queries 
SELECT * FROM mail WHERE subject MATCH 'software'; -- Selects rows 1 and 2 
SELECT * FROM mail WHERE body MATCH 'feedback'; -- Selects row 2 
SELECT * FROM mail WHERE mail MATCH 'software'; -- Selects rows 1, 2 and 3 
SELECT * FROM mail WHERE mail MATCH 'slow';  -- Selects rows 1 and 3 
+0

cosa dire quando l'espressione MATCH è sconosciuta, quindi con java pst.setString(), come cambierebbe l'istruzione? – Hoody

+0

Non uno degli esempi che hai appena copiato da documenti funziona come dici tu. La colonna è sempre specificata in ciascuna. – DoTheEvo

2

Utilizzando sub-query come soluzione alternativa:

OR interrogazione equivalente, come a MATCH 'cat' OR c MATCH 'cat':

SELECT * FROM table 
WHERE ROWID IN (
    SELECT ROWID FROM table WHERE a MATCH 'cat' 
UNION 
    SELECT ROWID FROM table WHERE b MATCH 'cat' 
); 

AND interrogazione equivalente, come a MATCH 'cat' AND c MATCH 'cat':

SELECT * FROM table WHERE ROWID IN (
    SELECT ROWID FROM table WHERE a MATCH 'cat' 
    AND ROWID IN (
     SELECT ROWID FROM table WHERE b MATCH 'cat' 
    ) 
); 
3

Per la condizione più colonne utilizzando l'uso PARTITA Unione per il 'OR' e utilizzare INTERSECT per la 'E'

SELECT * FROM TBL_VIRTUAL_APPOINTMENT WHERE PATIENT_PREFIX MATCH 'D*' 
UNION 
SELECT * FROM TBL_VIRTUAL_APPOINTMENT WHERE patient_first_name MATCH 'K*' 
Problemi correlati