2008-11-26 8 views
10

¿Cómo puedo escapar de un corchete en una consulta de SQL Server de texto completo? He intentado todo lo que sigue, ninguno de los cuales el trabajo:Soporte de escape [en una cláusula CONTAINS()?

CONTAINS(crev.RawText, 'arg[0]') 
CONTAINS(crev.RawText, 'arg[[0]]') 
CONTAINS(crev.RawText, 'arg\[0\]') 

El uso de comillas dobles funciona, pero obliga toda la búsqueda de ser una frase, que es una sensacional para múltiples consultas de palabras.

CONTAINS(crev.RawText, '"arg[0]"') 

Todo lo que realmente quiero hacer es mostrar los corchetes, pero me parece que no puede hacer eso ..

Respuesta

8

No tiene que escapar de [ya que no tiene ningún significado especial en la búsqueda de texto completo. Sin embargo, si necesita buscar una coincidencia exacta, puede usar las marcas "".

Además, puede utilizar múltiples "" dentro de las comillas simples:

CONTAINS('"word1" or "word2" or "word3"') 

Esto también funciona:

CONTAINS('"word1" and "word2" and "word3"') 

Cualquier cosa poner dentro de las comillas dobles se trata como texto exacto. Por lo tanto, si tuviera que hacer una búsqueda en el campo Descripción de la Producción.ProductDescription mesa en AdventureWorks, que podría utilizar

CONTAINS('shifting and "on or off-road"') 

y sería encontrar coincidencias de la palabra cambio, que también tenía la frase "fuera de carretera".

El único símbolo especial es el ~, se puede usar en lugar del comando NEAR.

CONTAINS('shifting ~ smooth') 

es lo mismo que

CONTAINS('shifting NEAR smooth') 

y encontrará partidos en las palabras cambiantes y lisos están cerca unos de otros.

+0

esto es correcto, pero usted TIENE que escapar del corchete (o colocarlo en múltiples Y y OR cita separadas como se muestra) - incluir el corchete fuera de las cotizaciones genera un error. –

+0

así que para ser 100% claro, esto funciona: 'CONTAINS (field, 'value AND" value [0] "')' pero esto no: 'CONTAINS (field, 'value" value [0] "')' . Debe incluir explícitamente las cláusulas booleanas –

+0

SELECCIONAR * FROM dbo.stackoverflow_319730 WHERE CONTAINS (txtcol, '"arg [0]" Y "arg [1]"' aún coincide arg [0] solo en mis datos de prueba . –

2

No en el espíritu de la indización de texto completo al parecer.

palabra

es una cadena de caracteres sin espacios o puntuacion .

frase

es una o más palabras con espacios entre cada palabra .

Y

Puntuacion se ignora. Por lo tanto, CONTAINS (prueba, "falla de la computadora") coincide con una fila con el valor "Donde es mi computadora? No encontrarlo sería costoso".

No estoy seguro de cuáles son sus opciones.

Obviamente LIKE funciona bien:

SELECT * 
FROM dbo.stackoverflow_319730 
WHERE txtcol LIKE 'arg[ [ ]0]' 

Pero

SELECT * 
FROM dbo.stackoverflow_319730 
WHERE CONTAINS(txtcol, '"arg[0]"') 

Incluso coincide con una columna con 'arg[1]' en ella, por ejemplo:

CREATE TABLE [dbo].[stackoverflow_319730](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [txtcol] [text] NOT NULL, 
CONSTRAINT [PK_stackoverflow_319730] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

INSERT INTO [dbo].[stackoverflow_319730] (txtcol) VALUES ('arg[0]') 
INSERT INTO [dbo].[stackoverflow_319730] (txtcol) VALUES ('arg[1]') 
INSERT INTO [dbo].[stackoverflow_319730] (txtcol) VALUES ('some other text') 
INSERT INTO [dbo].[stackoverflow_319730] (txtcol) VALUES ('arg[0], arg[1]') 

EXEC sp_fulltext_catalog 'FTCatalog','create' 
EXEC sp_fulltext_table  'stackoverflow_319730', 'create', 'FTCatalog', 'pk_stackoverflow_319730' 
EXEC sp_fulltext_column 'stackoverflow_319730', 'txtcol', 'add' 
EXEC sp_fulltext_table  'stackoverflow_319730','activate' 
EXEC sp_fulltext_catalog 'FTCatalog', 'start_full' 

SELECT * 
FROM dbo.stackoverflow_319730 
WHERE txtcol LIKE 'arg[ [ ]0]' 

SELECT * 
FROM dbo.stackoverflow_319730 
WHERE CONTAINS(txtcol, '"arg[0]"') 

Con los resultados que hacen referencia al problema con puntuación:

id   txtcol 
----------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
1   arg[0] 

(1 row(s) affected) 

id   txtcol 
----------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
1   arg[0] 
2   arg[1] 
4   arg[0], arg[1] 
Informational: The full-text search condition contained noise word(s). 
+0

Error de sintaxis cerca de '[' en la condición de búsqueda de texto completo 'arg [[] 0]'. –

+0

en esa declaración, hay espacio entre []], ¿qué ocurre cuando se eliminan todos los espacios? –

+0

Error de sintaxis cerca de '[' en la condición de búsqueda de texto completo 'arg [[] 0]' –