CONTAINS (Transact-SQL)

Actualizado: 14 de abril de 2006

Es un predicado que se utiliza para buscar, en columnas que contengan tipos de datos basados en caracteres, coincidencias exactas o aproximadas (menos precisas) con palabras o frases, palabras próximas a otra dada en una cierta distancia, o coincidencias ponderadas.

En SQL Server 2005, puede utilizar nombres de cuatro partes en los predicados de texto CONTAINS o FREETEXT para ejecutar consultas en relación con los servidores vinculados.

CONTAINS puede buscar:

  • Una palabra o una frase.
  • El prefijo de una palabra o una frase.
  • Una palabra cerca de otra palabra.
  • Una palabra que sea una inflexión de otra (por ejemplo, las palabras controles, controladores, controlando y controlado son inflexiones de control).
  • Una palabra que sea un sinónimo de otra palabra usando el diccionario de sinónimos (por ejemplo, la palabra metal puede tener sinónimos como aluminio y acero).

Icono de vínculo a temas Convenciones de sintaxis de Transact-SQL


CONTAINS
      ( { column_name | (column_list) | * } 
          , '< contains_search_condition >'     
   [ , LANGUAGE language_term ]
      ) 
< contains_search_condition > ::= 
    { < simple_term > 
    | < prefix_term > 
    | < generation_term > 
    | < proximity_term > 
    | < weighted_term > 
    } 
    | { ( < contains_search_condition > ) 
    [ { < AND > | < AND NOT > | < OR > } ] 
    < contains_search_condition > [ ...n ] 
    } 
< simple_term > ::= 
          word | " phrase "
< prefix term > ::= 
     { "word * " | "phrase *" }
< generation_term > ::= 
     FORMSOF ( { INFLECTIONAL | THESAURUS } , < simple_term > [ ,...n ] ) 
< proximity_term > ::= 
     { < simple_term > | < prefix_term > } 
     { { NEAR | ~ }
     { < simple_term > | < prefix_term > } 
     } [ ...n ] 
< weighted_term > ::= 
     ISABOUT 
        ( { { 
  < simple_term > 
  | < prefix_term > 
  | < generation_term > 
  | < proximity_term > 
  } 
   [ WEIGHT ( weight_value ) ] 
   } [ ,...n ] 
        ) 
< AND > ::= 
     { AND | & }
< AND NOT > ::= 
     { AND NOT | & !}
< OR > ::= 
     { OR | | }

column_name

Es el nombre de la columna o columnas incluidas en el índice de texto. Las columnas de tipo char, varchar, nchar, nvarchar, text, ntext, image, xml y varbinary(max) son válidas para la búsqueda de texto.

column_list

Indica que se pueden especificar varias columnas, separadas por una coma. column_list se debe incluir entre paréntesis. A menos que se especifique language_term, el idioma de todas las columnas de column_list debe ser el mismo.

*

Especifica que todas las columnas de la tabla registradas para búsquedas de texto se deben utilizar en la condición de búsqueda. Las columnas de la cláusula CONTAINS deben proceder de una sola tabla. Si en la cláusula FROM hay más de una tabla, * se tiene que especificar con el nombre de la tabla. A menos que se especifique language_term, el idioma de todas las columnas de la tabla debe ser el mismo.

LANGUAGE language_term

Es el idioma en que el usuario genera la consulta. Si la columna contiene varios documentos almacenados como objetos binarios grandes (BLOB), el idioma utilizado para indizar el contenido del documento real se determina mediante el identificador de configuración regional (LCID) del documento. Por consiguiente, una sola columna puede almacenar varios idiomas. El parámetro LANGUAGE permite a los usuarios especificar el idioma en que van a realizar la búsqueda y aumentar así la probabilidad de encontrar coincidencias.

Este parámetro es opcional y se puede especificar como una cadena, un entero o un valor hexadecimal correspondiente al LCID de un idioma. Si se especifica language_term, el idioma que representa se aplica a todos los elementos de la condición de búsqueda. Si no se especifica ningún valor, se utiliza el idioma de texto de la columna.

Si el valor especificado es una cadena, language_term corresponde al valor de columna alias de la tabla del sistema syslanguages. La cadena debe ir entre comillas simples, como en 'language_term'. Si el valor especificado es un entero, language_term es el LCID real que identifica el idioma. Si se especifica como un valor hexadecimal, language_term es 0x seguido del valor hexadecimal del LCID. El valor hexadecimal no puede tener más de ocho dígitos, incluidos los ceros a la izquierda.

Si el valor está en formato DBCS (juego de caracteres de doble byte), SQL Server lo convertirá a Unicode.

Si el idioma especificado no es válido o no hay recursos instalados que se correspondan con dicho idioma, SQL Server devuelve un error. Para utilizar recursos de idioma neutral, especifique 0x0 como language_term.

<contains_search_condition>

Especifica el texto que se va a buscar en column_name y las condiciones para obtener coincidencias.

contains_search_condition es de tipo nvarchar. Se realiza una conversión implícita cuando se usa otro tipo de datos de carácter como entrada. En el siguiente ejemplo, la variable @SearchWord, definida como una variable de tipo varchar(30), provoca una conversión implícita en el predicado CONTAINS.


USE AdventureWorks;
GO
DECLARE @SearchWord varchar(30)
SET @SearchWord ='performance'
SELECT Description 
FROM Production.ProductDescription 
WHERE CONTAINS(Description, @SearchWord);

Como el "examen de parámetros" no funciona con la conversión, use nvarchar para obtener mejor rendimiento. En el ejemplo, declare @SearchWord como nvarchar(30).


USE AdventureWorks;
GO
DECLARE @SearchWord nvarchar(30)
SET @SearchWord = N'performance'
SELECT Description 
FROM Production.ProductDescription 
WHERE CONTAINS(Description, @SearchWord);

También puede usar la sugerencia de consulta OPTIMIZE FOR para los casos en los que se genera un plan subóptimo.

word

Es una cadena de caracteres sin espacios ni signos de puntuación.

phrase

Es una o varias palabras con espacios entre cada una de ellas.

ms187787.note(es-es,SQL.90).gifNota:
Algunos idiomas, como los de algunas partes de Asia, pueden tener frases que contengan una o varias palabras sin espacios entre ellas.

<simple_term>

Especifica una coincidencia para una palabra o frase exactas. Ejemplos de términos simples válidos son "blue berry", blueberry y "Microsoft SQL Server". Las frases tienen que ir entre comillas dobles (""). Las palabras de una frase tienen que aparecer en la columna de la base de datos en el mismo orden que el especificado en <contains_search_condition>. La búsqueda de caracteres en la palabra o la frase no distingue mayúsculas de minúsculas. Las palabras irrelevantes (como un, y, la) de las columnas de texto indizadas no se almacenan en los índices de texto. Si se utiliza una palabra irrelevante en la búsqueda de una sola palabra, SQL Server devuelve un mensaje de error que indica que la consulta contiene sólo palabras irrelevantes. SQL Server incluye una lista estándar de palabras irrelevantes en el directorio \Mssql\Binn\FTERef de cada instancia de SQL Server.

Los signos de puntuación se omiten. Por lo tanto, CONTAINS(testing, "computer failure") coincide con una fila que contiene el valor "Where is my computer? Failure to find it would be expensive." Para obtener más información sobre el comportamiento de los separadores de palabras, vea Separadores de palabras y lematizadores.

<prefix_term>

Especifica la coincidencia de palabras o frases que comiencen con el texto especificado. Incluya un término prefijo entre comillas dobles ("") y agregue un asterisco (*) delante de las comillas de cierre, de modo que se haga coincidir con cualquier texto que comience con el término sencillo especificado antes del asterisco. La cláusula debe especificarse de esta manera: El asterisco representa cero, uno o más caracteres (de la palabra raíz o de las palabras de la palabra o la frase). Si el texto y el asterisco no se delimitan con comillas dobles de modo que el predicado sea CONTAINS (column, 'text*'), la búsqueda de texto considera el asterisco un carácter y busca coincidencias exactas con text*. El motor de texto no encuentra palabras con el carácter de asterisco (*) porque los separadores de palabras suelen omitir dichos caracteres.

Cuando <prefix_term> es una frase, todas las palabras de dicha frase se consideran prefijos. Por tanto, una consulta que especifique el prefijo "local wine*" hace que se devuelvan todas las filas que contengan el texto "local winery", "locally wined and dined", etc.

<generation_term>

Especifica la coincidencia de palabras cuando los términos simples incluyen variaciones de la palabra original que se busca.

INFLECTIONAL

Especifica que se va a utilizar el analizador lingüístico dependiente del idioma en el término simple especificado. El comportamiento del analizador lingüístico se define en función de las reglas de análisis lingüístico de cada idioma concreto. El idioma neutro no tiene ningún analizador lingüístico asociado. El idioma de las columnas que se van a consultar se utiliza para hacer referencia al analizador lingüístico deseado. Si se especifica language_term, se utiliza el analizador lingüístico correspondiente a dicho idioma.

Un <simple_term> dado dentro de un <generation_term> no devolverá nombres y verbos a la vez.

THESAURUS

Especifica que se utiliza el diccionario de sinónimos correspondiente al idioma de texto de la columna o el idioma especificado en la consulta. El patrón o patrones más largos de simple_term se hacen coincidir con el diccionario de sinónimos y se generan términos adicionales para expandir o reemplazar el patrón original. Si no se encuentra ninguna coincidencia para todo o parte de simple_term, la parte no coincidente se trata como un simple_term. Para obtener más información sobre el diccionario de sinónimos de búsqueda de texto, vea Diccionario de sinónimos.

<proximity_term>

Especifica una coincidencia de palabras o frases que deben estar próximas entre sí. <proximity_term> funciona de forma similar al operador AND: ambos requieren que existan varias palabras o frases en la columna examinada. Cuanto más próximas estén las palabras de <proximity_term>, mayor será la coincidencia.

NEAR | ~

Indica que la palabra o frase situada a la izquierda del operador NEAR o ~ tiene que estar bastante cerca de la palabra o frase situada a la derecha del operador NEAR o ~. Se pueden encadenar varios términos de proximidad, por ejemplo:

a NEAR b NEAR c 

Esto significa que la palabra o frase a tiene que estar cerca de la palabra o frase b, que a su vez tiene que estar cerca de la palabra o frase c. Si varios términos de proximidad están encadenados, todos los términos de proximidad deben encontrase próximos. Por lo tanto, en el ejemplo a ~ b ~ c, la palabra o frase a también debe estar cerca de la palabra o frase c.

<weighted_term>

Especifica que las filas coincidentes (devueltas por la consulta) coinciden con una lista de palabras y frases a las que se asigna opcionalmente un valor ponderado.

ISABOUT

Especifica la palabra clave <weighted_term>.

WEIGHT(weight_value)

Especifica el valor de ponderación como un número entre 0,0 y 1,0. Cada componente de <weighted_term> puede incluir un weight_value. weight_value es una forma de modificar cómo varias partes de una consulta afectan al valor de rango asignado a cada fila que coincide con la consulta. WEIGHT no influye en los resultados de las consultas CONTAINS, pero sí que influye en el rango de las consultas CONTAINSTABLE. Para obtener más información, vea CONTAINSTABLE (Transact-SQL).

ms187787.note(es-es,SQL.90).gifNota:
El separador decimal siempre es un punto independientemente de la configuración regional del sistema operativo.

{ AND | & } | { AND NOT | &! } | { OR | | }

Especifica una operación lógica entre dos condiciones de búsqueda.

AND | &

Indica que en ambos casos se incluyen condiciones de búsqueda que se deben cumplir para encontrar coincidencias. Se puede utilizar el símbolo de "y" comercial (&) en lugar de la palabra clave AND para representar el operador AND.

AND NOT | &!

Indica que la segunda condición de búsqueda no puede estar presente para encontrar coincidencias. Se puede utilizar el símbolo de "y" comercial seguido del signo de exclamación (&!) en lugar de la palabra clave AND NOT para representar el operador AND NOT.

OR | |

Indica que en uno de los dos casos se incluyen condiciones de búsqueda que se deben cumplir para encontrar coincidencias. Se puede utilizar el símbolo de barra (|) en lugar de la palabra clave OR para representar el operador OR.

Cuando <contains_search_condition> contiene grupos entre paréntesis, dichos grupos entre paréntesis se evalúan primero. Después de evaluar los grupos entre paréntesis, se aplican las reglas siguientes cuando se utilizan estos operadores lógicos con condiciones de búsqueda:

  • NOT se aplica antes que AND.
  • NOT sólo puede estar a continuación de AND, como en AND NOT. No se acepta el operador OR NOT. NOT no se puede especificar antes del primer término. Por ejemplo, CONTAINS (mycolumn, 'NOT "phrase_to_search_for" ' ) no es válido.
  • AND se aplica antes que OR.
  • Los operadores booleanos del mismo tipo (AND, OR) son asociativos y, por tanto, se pueden aplicar en cualquier orden.
n

Es un marcador de posición que indica que se pueden especificar varias condiciones y términos de búsqueda.

CONTAINS no se reconoce como palabra clave si el nivel de compatibilidad es inferior a 70. Para obtener más información, vea sp_dbcmptlevel (Transact-SQL).

A. Usar CONTAINS con <simple_term>

En este ejemplo se buscan todos los productos con un precio de $80.99 que contengan la palabra "Mountain".

USE AdventureWorks;
GO
SELECT Name, ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
   AND CONTAINS(Name, 'Mountain');
GO

B. Usar CONTAINS y una frase en <simple_term>

En el siguiente ejemplo se obtienen todos los productos que contienen la palabra "Mountain" o "Road".

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Mountain" OR "Road" ')
GO

C. Usar CONTAINS con <prefix_term>

En el siguiente ejemplo se obtienen todos los nombres de producto con una palabra como mínimo que empiece por el prefijo "chain" en la columna Name.

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Chain*" ');
GO

D. Usar CONTAINS y OR con <prefix_term>

En el siguiente ejemplo se obtienen todas las descripciones de categorías que contienen cadenas con los prefijos "chain" o "full".

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, '"chain*" OR "full*"');
GO

E. Usar CONTAINS con <proximity_term>

En el siguiente ejemplo se obtienen todos los nombres de los productos que tengan la palabra bike cerca de la palabra performance.

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, 'bike NEAR performance');
GO

F. Usar CONTAINS con <generation_term>

En el siguiente ejemplo se buscan todos los productos que tengan palabras derivadas de ride: riding, ridden, etc.

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, ' FORMSOF (INFLECTIONAL, ride) ');
GO

G. Usar CONTAINS con <weighted_term>

En el siguiente ejemplo se buscan todos los nombres de productos que contengan las palabras performance, comfortable o smooth; se asignan pesos distintos a cada palabra.

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, 'ISABOUT (performance weight (.8), 
comfortable weight (.4), smooth weight (.2) )' );
GO

H. Usar CONTAINS con variables

En el siguiente ejemplo se utiliza una variable en lugar de un término de búsqueda específico.

USE AdventureWorks;
GO
DECLARE @SearchWord nvarchar(30)
SET @SearchWord = N'Performance'
SELECT Description 
FROM Production.ProductDescription 
WHERE CONTAINS(Description, @SearchWord);
GO

Versión Historial

14 de abril de 2006

Contenido nuevo:
  • Se ha agregado información sobre cómo evitar la conversión con contains_search_condition.

15 de septiembre de 2007

Contenido nuevo:
  • Se agregó una nota sobre el separador decimal a la definición ISABOUT.

Adiciones de comunidad

AGREGAR
Mostrar: