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.
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.
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.
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
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
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.
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
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
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)
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
.
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:)
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' )
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.
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
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')
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