SQL SELECCIONE DONDE el campo contiene palabras


Necesito un select que devuelva 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.

 336
Author: Ben Sutton, 2013-01-12

14 answers

Bastante lento, pero método de trabajo para incluir cualquier de palabras:

SELECT * FROM mytable
WHERE column1 LIKE '%word1%'
   OR column1 LIKE '%word2%'
   OR column1 LIKE '%word3%'

Si necesitas todas las palabras para estar presentes, usa esto:

SELECT * FROM mytable
WHERE column1 LIKE '%word1%'
  AND column1 LIKE '%word2%'
  AND column1 LIKE '%word3%'

Si desea algo más rápido, debe buscar en la búsqueda de texto completo, y esto es muy específico para cada tipo de base de datos.

 533
Author: mvp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-12 06:27:42

Tenga en cuenta que si utiliza LIKE para determinar si una cadena es una subcadena de otra cadena, debe escapar de los caracteres coincidentes del patrón en su cadena de búsqueda.

Si su dialecto SQL admite CHARINDEX, es mucho más fácil usarlo en su lugar:

SELECT * FROM MyTable
WHERE CHARINDEX('word1', Column1) > 0
  AND CHARINDEX('word2', Column1) > 0
  AND CHARINDEX('word3', Column1) > 0

Además, tenga en cuenta que este y el método en la respuesta aceptada solo cubren la coincidencia de subcadenas en lugar de la coincidencia de palabras. Así, por ejemplo, la cadena 'word1word2word3' seguiría partido.

 48
Author: Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-05 00:38:28

Función

 CREATE FUNCTION [dbo].[fnSplit] ( @sep CHAR(1), @str VARCHAR(512) )
 RETURNS TABLE AS
 RETURN (
           WITH Pieces(pn, start, stop) AS (
           SELECT 1, 1, CHARINDEX(@sep, @str)
           UNION ALL
           SELECT pn + 1, stop + 1, CHARINDEX(@sep, @str, stop + 1)
           FROM Pieces
           WHERE stop > 0
      )

      SELECT
           pn AS Id,
           SUBSTRING(@str, start, CASE WHEN stop > 0 THEN stop - start ELSE 512 END) AS Data
      FROM
           Pieces
 )

Consulta

 DECLARE @FilterTable TABLE (Data VARCHAR(512))

 INSERT INTO @FilterTable (Data)
 SELECT DISTINCT S.Data
 FROM fnSplit(' ', 'word1 word2 word3') S -- Contains words

 SELECT DISTINCT
      T.*
 FROM
      MyTable T
      INNER JOIN @FilterTable F1 ON T.Column1 LIKE '%' + F1.Data + '%'
      LEFT JOIN @FilterTable F2 ON T.Column1 NOT LIKE '%' + F2.Data + '%'
 WHERE
      F2.Data IS NULL
 16
Author: Eduardo Cuomo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-30 18:23:56

En lugar de SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3', agregue y entre esas palabras como:

SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 And word2 And word3'

Para más detalles, ver aquí https://msdn.microsoft.com/en-us/library/ms187787.aspx

UPDATE

Para seleccionar frases, use comillas dobles como:

SELECT * FROM MyTable WHERE Column1 CONTAINS '"Phrase one" And word2 And "Phrase Two"'

p. d. primero debe habilitar la Búsqueda de Texto completo en la tabla antes de usar la palabra clave contiene. para más detalles, ver aquí https://docs.microsoft.com/en-us/sql/relational-databases/search/get-started-with-full-text-search

 9
Author: messed-up,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-20 12:22:56
SELECT * FROM MyTable WHERE 
Column1 LIKE '%word1%'
AND Column1 LIKE '%word2%'
AND Column1 LIKE  '%word3%'

Cambiado OR a AND basado en editar a pregunta.

 5
Author: Jon Crowell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-12 06:30:41

Si solo quieres encontrar una coincidencia.

SELECT * FROM MyTable WHERE INSTR('word1 word2 word3',Column1)<>0

SQL Server:

CHARINDEX(Column1, 'word1 word2 word3', 1)<>0

Para obtener la coincidencia exacta. El ejemplo (';a;ab;ac;',';b;') no obtendrá una coincidencia.

SELECT * FROM MyTable WHERE INSTR(';word1;word2;word3;',';'||Column1||';')<>0
 5
Author: Joshua Balan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-09 15:08:09

Si está utilizando Oracle Database entonces puede lograr esto utilizando contiene consulta. Contiene querys son más rápidos que like query.

Si necesitas todas las palabras

SELECT * FROM MyTable WHERE CONTAINS(Column1,'word1 and word2 and word3', 1) > 0

Si necesitas alguna de las palabras

SELECT * FROM MyTable WHERE CONTAINS(Column1,'word1 or word2 or word3', 1) > 0

Contiene el índice de necesidad del tipo CONTEXT en su columna.

CREATE INDEX SEARCH_IDX ON MyTable(Column) INDEXTYPE IS CTXSYS.CONTEXT
 3
Author: mirmdasif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-29 12:15:40

¿Por qué no usar "in" en su lugar?

Select *
from table
where columnname in (word1, word2, word3)
 1
Author: Michael Angerbauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-10 02:31:55
SELECT * FROM MyTable WHERE Column1 Like "*word*"

Esto mostrará todos los registros donde column1 tiene un valor parcial contiene word.

 0
Author: Jino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-27 08:40:37

Intente utilizar la "búsqueda 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 tienen una pequeña cantidad de consumo de memoria que los otros. intente buscar esta función:)

 0
Author: Daryl Arenas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-31 02:35:13

La mejor manera es hacer un índice de texto completo en una columna en la tabla y usar contain en lugar de LIKE

SELECT * FROM MyTable WHERE 
contains(Column1 , N'word1' )
AND contains(Column1 , N'word2' )
AND contains(Column1 , N'word3' )
 0
Author: MiladAhmadi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-14 06:34:04

Una de las formas más fáciles de lograr lo que se menciona en la pregunta es usando CONTIENE con CERCA o '~'. Por ejemplo, las siguientes consultas nos darán todas las columnas que incluyen específicamente word1, word2 y word3.

SELECT * FROM MyTable WHERE CONTAINS(Column1, 'word1 NEAR word2 NEAR word3')

SELECT * FROM MyTable WHERE CONTAINS(Column1, 'word1 ~ word2 ~ word3')

Además, CONTAINSTABLE devuelve un rango para cada documento basado en la proximidad de "word1", "word2" y "word3". Por ejemplo, si un documento contiene la oración, "El word1 es word2 y word3," su clasificación sería alta porque el los términos están más cerca unos de otros que en otros documentos.

Otra cosa que me gustaría añadir es que también podemos usar proximity_term para encontrar columnas donde las palabras están dentro de una distancia específica entre ellas dentro de la frase de columna.

 0
Author: Anastasios Selmanis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-01 16:06:57
DECLARE @SearchStr nvarchar(100)
SET @SearchStr = ' '



CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))

SET NOCOUNT ON

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET  @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

WHILE @TableName IS NOT NULL

BEGIN
    SET @ColumnName = ''
    SET @TableName = 
    (
        SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
        FROM     INFORMATION_SCHEMA.TABLES
        WHERE         TABLE_TYPE = 'BASE TABLE'
            AND    QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
            AND    OBJECTPROPERTY(
                    OBJECT_ID(
                        QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                         ), 'IsMSShipped'
                           ) = 0
    )

    WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)

    BEGIN
        SET @ColumnName =
        (
            SELECT MIN(QUOTENAME(COLUMN_NAME))
            FROM     INFORMATION_SCHEMA.COLUMNS
            WHERE         TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                AND    TABLE_NAME    = PARSENAME(@TableName, 1)
                AND    DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal')
                AND    QUOTENAME(COLUMN_NAME) > @ColumnName
        )

        IF @ColumnName IS NOT NULL

        BEGIN
            INSERT INTO #Results
            EXEC
            (
                'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) FROM ' + @TableName + ' (NOLOCK) ' +
                ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
            )
        END
    END   
END

SELECT ColumnName, ColumnValue FROM #Results

DROP TABLE #Results
 -1
Author: user2274887,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-05 11:02:13
select * from table where name regexp '^word[1-3]$'

O

select * from table where name in ('word1','word2','word3')
 -2
Author: vidyadhar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-29 00:26:24