Sql server 转义括号[在CONTAINS()子句中]?

Sql server 转义括号[在CONTAINS()子句中]?,sql-server,tsql,Sql Server,Tsql,如何在全文SQL Servercontains()query中转义括号?我已尝试了以下所有方法,但均无效: CONTAINS(crev.RawText, 'arg[0]') CONTAINS(crev.RawText, 'arg[[0]]') CONTAINS(crev.RawText, 'arg\[0\]') 使用双引号确实有效,但它强制整个搜索成为一个短语,这对于多个单词查询来说是一个“showstopper” CONTAINS(crev.RawText, '"arg[0]"') 我真正

如何在全文SQL Server
contains()
query中转义括号?我已尝试了以下所有方法,但均无效:

CONTAINS(crev.RawText, 'arg[0]')
CONTAINS(crev.RawText, 'arg[[0]]')
CONTAINS(crev.RawText, 'arg\[0\]')
使用双引号确实有效,但它强制整个搜索成为一个短语,这对于多个单词查询来说是一个“showstopper”

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

我真正想做的就是避开括号,但我似乎无法做到这一点。

显然没有全文索引的精神

是一个不带字符的字符串 空格或标点符号

词组

是一个或多个带空格的单词 字里行间

标点符号被忽略。因此, 包含(测试,“计算机故障”) 将一行与值“Where”匹配 是我的电脑吗?找不到 会很贵。”

我不确定你有什么选择

显然
LIKE
很好:

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

甚至将列与其中的
'arg[1]
匹配,例如:

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]"')
结果提示标点符号存在问题:

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

您不必转义[1],因为它在全文搜索中没有特殊意义。但是,如果确实需要搜索精确匹配,可以使用“”标记

此外,您可以在单引号内使用多个“”:

CONTAINS('"word1" or "word2" or "word3"')
这也适用于:

CONTAINS('"word1" and "word2" and "word3"')
双引号内的任何内容都被视为精确文本。因此,如果我要在AdventureWorks中搜索Production.ProductDescription表的Description字段,我可以使用

CONTAINS('shifting and "on or off-road"') 
它会找到与单词移位相匹配的词,这个词也有“在路上或越野”这个短语

唯一的特殊符号是~,它可以用来代替NEAR命令

CONTAINS('shifting ~ smooth')

CONTAINS('shifting NEAR smooth')

并将在单词shift和smooth彼此相邻的位置找到匹配项。

全文搜索条件“arg[[]0]”中“[”附近的语法错误。在该语句中,[]之间有空格,当删除所有空格时会发生什么情况?全文搜索条件“arg[]0”中“[”附近的语法错误'这是正确的,但您必须转义括号(或将其放在多个和/或单独的引号中,如您所示)--将括号包含在引号之外会生成错误。因此,为了100%清楚,这是可行的:
包含(字段,'value AND“value[0]”)
但这不可行:
包含(字段,'value“value[0]”)
。您必须显式地包含dbo.stackoverflow_319730中的布尔子句select*,其中CONTAINS(txtcol)、“arg[0]”和“arg[1]”在我的测试数据中仍然单独匹配arg[0]。
CONTAINS('shifting NEAR smooth')