2010-10-30 15 views
13

Digamos que tengo una tabla con las columnas A, B, C, D y quiero hacer un partido en la columna A y C¿Cómo se relaciona una columna múltiple en una tabla con SQLite FTS3?

veo que usted puede coincidir con una sola columna o toda la columna en decir sqlite

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

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

¿Es posible hacer coincidir solo las columnas A y C? Si no, ¿cómo se las arreglan?

¡Gracias por su sugerencia!

Respuesta

24

No creo que pueda usar múltiples operadores de MATCH en una sola consulta FTS. Use column_name: target_term para buscar varias columnas usando una búsqueda de texto completo.

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

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

+0

¿y si el gato contiene 'O'? ¿Cómo escapas? – Alex

+0

@Alex FTS busca términos enteros, no subcadenas, por lo que no es necesario escapar de algo como 'A: pobre O C: o'. Y O NO debe estar en mayúscula, los términos son minúsculos. http://www.sqlite.org/fts3.html#section_3_1 –

+0

Por alguna extraña razón: SELECCIONAR * FROM tabla WHERE tabla MATCH "campo: v.sport 1" me está dando resultados diferentes de SELECCIONAR * FROM tabla DONDE coincida el campo " v.sport 1 ", dado" V.sport 1 "es mi término de búsqueda. – kroe

-1

Puede concatenar columnas usando || operador:

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

No estoy seguro acerca de la función de concordancia en SQLite embargo, creo que es por lo general una excepción (ver http://www.sqlite.org/lang_expr.html#match).

+2

No, sqlite no se parece a la de esa manera, aunque se puede volver columna concatenar es decir, seleccionar una || b de la tabla donde coinciden 'cat' – Unikorn

+0

¿Cuál es la precedencia del operador aquí? Match o ||? Prueba algunos paréntesis. – MPelletier

+1

en realidad, noté que puedes hacer algo como esto: selecciona * de la tabla donde la tabla coincide con 'colA: cat OR colB: cat', pero el rendimiento es horrible comparado con tener colA y colB en una columna y hacer una coincidencia eso. – Unikorn

7

En lugar de especificar con qué columnas coincidir, puede especificar la tabla completa para que coincida. Por ejemplo:

-- 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

¿Qué pasa cuando la expresión MATCH es desconocida, por lo que con java pst.setString(), cómo cambiaría la declaración? – Hoody

+0

Ninguno de los ejemplos que acaba de copiar de documentos funciona como usted afirma que son. La columna siempre se especifica en cada uno. – DoTheEvo

2

Uso de sub-consultas como solución:

OR consulta equivalente, como 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 consulta equivalente, como 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

Para la condición de varias columnas usando UNIÓN uso rival para el 'O' y utilizar INTERSECT para la 'Y'

SELECT * FROM TBL_VIRTUAL_APPOINTMENT WHERE PATIENT_PREFIX MATCH 'D*' 
UNION 
SELECT * FROM TBL_VIRTUAL_APPOINTMENT WHERE patient_first_name MATCH 'K*' 
Cuestiones relacionadas