Sql server 转义括号[在CONTAINS()子句中]?
如何在全文SQL ServerSql 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]"') 我真正
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')