sql-server - operador - sql server escape special characters
Escaping Bracket[en una cláusula CONTAINS() (2)
¿Cómo puedo escapar de un paréntesis en una consulta de SQL Server de texto completo contains()
? Intenté todo lo siguiente, ninguno de los cuales funciona:
CONTAINS(crev.RawText, ''arg[0]'')
CONTAINS(crev.RawText, ''arg[[0]]'')
CONTAINS(crev.RawText, ''arg/[0/]'')
El uso de comillas dobles sí funciona, pero fuerza a que toda la búsqueda sea una frase , lo cual es sorprendente para las consultas de múltiples palabras.
CONTAINS(crev.RawText, ''"arg[0]"'')
Todo lo que realmente quiero hacer es escapar del paréntesis, pero parece que no puedo hacer eso ...
No en el espíritu de indización de texto completo aparentemente.
palabra
Es una cadena de caracteres sin espacios ni signos de puntuación.
frase
Es una o más palabras con espacios entre cada palabra.
Y
La puntuación es ignorada. Por lo tanto, CONTAINS (prueba, "falla de la computadora") coincide con una fila con el valor "¿Dónde está mi computadora? No encontrarla sería costoso".
No estoy seguro de cuáles son tus opciones.
Obviamente LIKE
funciona bien:
SELECT *
FROM dbo._319730
WHERE txtcol LIKE ''arg[ [ ]0]''
Pero
SELECT *
FROM dbo._319730
WHERE CONTAINS(txtcol, ''"arg[0]"'')
Incluso coincide con una columna con ''arg[1]''
en ella, por ejemplo:
CREATE TABLE [dbo].[_319730](
[id] [int] IDENTITY(1,1) NOT NULL,
[txtcol] [text] NOT NULL,
CONSTRAINT [PK__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].[_319730] (txtcol) VALUES (''arg[0]'')
INSERT INTO [dbo].[_319730] (txtcol) VALUES (''arg[1]'')
INSERT INTO [dbo].[_319730] (txtcol) VALUES (''some other text'')
INSERT INTO [dbo].[_319730] (txtcol) VALUES (''arg[0], arg[1]'')
EXEC sp_fulltext_catalog ''FTCatalog'',''create''
EXEC sp_fulltext_table ''_319730'', ''create'', ''FTCatalog'', ''pk__319730''
EXEC sp_fulltext_column ''_319730'', ''txtcol'', ''add''
EXEC sp_fulltext_table ''_319730'',''activate''
EXEC sp_fulltext_catalog ''FTCatalog'', ''start_full''
SELECT *
FROM dbo._319730
WHERE txtcol LIKE ''arg[ [ ]0]''
SELECT *
FROM dbo._319730
WHERE CONTAINS(txtcol, ''"arg[0]"'')
Con resultados que sugieren el problema con la 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).
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 usar 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 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 tabla Production.ProductDescription en AdventureWorks, podría usar
CONTAINS(''shifting and "on or off-road"'')
y encontraría coincidencias para el cambio de palabra que también tenía la frase "dentro o fuera de la carretera".
El único símbolo especial es el ~, puede usarse en lugar del comando NEAR.
CONTAINS(''shifting ~ smooth'')
es lo mismo que
CONTAINS(''shifting NEAR smooth'')
y encontrará coincidencias donde las palabras cambiante y suave se encuentran una cerca de la otra.