Necesito una selección que arroje resultados como este:
SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3'
Y necesito todos los resultados, es decir, esto incluye cadenas con 'word2 word3 word1' o 'word1 word3 word2' o cualquier otra combinación de los tres.
Todas las palabras deben estar en el resultado.
word3 word2 word1
.Tenga en cuenta que si usa
LIKE
para determinar si una cadena es una subcadena de otra cadena, debe escapar de los caracteres coincidentes de patrón en su cadena de búsqueda.Si su dialecto SQL es compatible
CHARINDEX
, es mucho más fácil usarlo:Además, tenga en cuenta que esto y el método en la respuesta aceptada solo cubren la coincidencia de subcadenas en lugar de la coincidencia de palabras. Entonces, por ejemplo, la cadena
'word1word2word3'
aún coincidiría.fuente
InStr()
en su lugarCHARINDEX
Función
Consulta
fuente
En lugar de
SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3'
, agregue Y entre esas palabras como:para más detalles, consulte aquí https://msdn.microsoft.com/en-us/library/ms187787.aspx
ACTUALIZAR
Para seleccionar frases, use comillas dobles como:
PD : primero debe habilitar la búsqueda de texto completo en la tabla antes de usar la palabra clave contiene. para más detalles, vea aquí https://docs.microsoft.com/en-us/sql/relational-databases/search/get-started-with-full-text-search
fuente
Cambiado
OR
aAND
basado en editar a pregunta.fuente
Si está utilizando la base de datos Oracle , puede lograr esto utilizando la consulta contiene . Contiene consultas son más rápidas que como consulta.
Si necesitas todas las palabras
Si necesitas alguna de las palabras
Contiene el índice de necesidad de tipo CONTEXTO en su columna.
fuente
Si solo quieres encontrar una coincidencia.
Servidor SQL :
Para obtener la coincidencia exacta. El ejemplo
(';a;ab;ac;',';b;')
no obtendrá una coincidencia.fuente
intente utilizar la "búsqueda de tesarus" en el índice de texto completo en MS SQL Server. Esto es mucho mejor que usar "%" en la búsqueda si tiene millones de registros. Tesarus tiene una pequeña cantidad de consumo de memoria que los demás. intenta buscar estas funciones :)
fuente
la mejor manera es hacer un índice de texto completo en una columna de la tabla y usar contener en lugar de LIKE
fuente
¿por qué no usar "in" en su lugar?
fuente
Una de las formas más fáciles de lograr lo que se menciona en la pregunta es usar CONTAINS con NEAR o '~'. Por ejemplo, las siguientes consultas nos darían todas las columnas que incluyen específicamente word1, word2 y word3.
Además, CONTAINSTABLE devuelve un rango para cada documento en función de la proximidad de "word1", "word2" y "word3". Por ejemplo, si un documento contiene la oración, "La palabra1 es palabra2 y palabra3", su clasificación sería alta porque los términos están más cercanos entre sí que en otros documentos.
Otra cosa que me gustaría agregar es que también podemos usar proximidad_term para encontrar columnas donde las palabras están dentro de una distancia específica entre ellas dentro de la frase de la columna.
fuente
Idealmente, esto debería hacerse con la ayuda de la búsqueda de texto completo del servidor sql si se usa. Sin embargo, si no puede hacer que eso funcione en su base de datos por alguna razón, aquí hay una solución de alto rendimiento:
fuente
Esto mostrará todos los registros donde
column1
contiene un valor parcialword
.fuente
fuente
o
fuente