【问题标题】:SQL Server 'LIKE' or varchar issueSQL Server 'LIKE' 或 varchar 问题
【发布时间】:2018-08-10 19:19:40
【问题描述】:

我有一个存储过程,它通过传递给varchar 的字符串搜索列上的表。

这可行,返回具有正确 ING_LOC_DESCRIPTION 的特定记录

DECLARE @strSearch VARCHAR(500)
SET @strSearch = 'Care1st LETTER Location'

SELECT TOP 10 ING_LOC_DESCRIPTION
FROM [CDRS].[ING_LOC_TRANS_MASTER]
WHERE [ING_LOC_DESCRIPTION] LIKE '%' + @strSearch + '%'
ORDER BY [ING_LOC_ID]

这不起作用返回由ING_LOC_ID排序的所有记录的前十个结果:

DECLARE @strSearch VARCHAR(500)
SET @strSearch = '[{"WorkFlowID":"MoveFile"}]'

SELECT TOP 10 ING_LOC_DESCRIPTION
FROM [CDRS].[ING_LOC_TRANS_MASTER]
WHERE [ING_LOC_DESCRIPTION] LIKE '%' + @strSearch + '%'
ORDER BY [ING_LOC_ID]

这些字符 [, {, ", :, }, ] 在 varchar 中是否无效?它被解释为 2 个字符串吗?还是 LIKE 关键字有问题?

字符串赋值似乎没问题,因为

DECLARE @strSearch VARCHAR(500)
SET @strSearch = '[{"WorkFlowID":"MoveFile"}]'

SELECT @strSearch

返回

[{"WorkFlowID":"MoveFile"}]

不幸的是

DECLARE @strSearch VARCHAR(500)
SET @strSearch = '[{"WorkFlowID":"MoveFile"}]'

SELECT @strSearch LIKE '[{"WorkFlowID":"MoveFile"}]'

没有像我希望的那样返回真或假,它返回一个错误

消息 156,第 15 级,状态 1,第 3 行
关键字“LIKE”附近的语法不正确

我认为LIKE 只能在WHERE 子句中使用,所以我认为使用LIKE 不会有问题。

【问题讨论】:

  • SQL Server 支持bit 数据类型。 (有效值为 0、1、'TRUE' 和 'FALSE'。)有一个 boolean 数据类型(具有 TRUE、FALSE 和 UNKNOWN 值),但您无法牢牢抓住一个:“不像其他 SQL Server数据类型,布尔数据类型不能指定为表列或变量的数据类型,也不能在结果集中返回。”您可以使用case when @TestString like @Pattern then 1 else 0 endlike 测试中获取0/1 值。

标签: sql sql-server tsql sql-like


【解决方案1】:

是的。在LIKE 中,[/] 限定了一个字符类。所以代码匹配任何包含{"W等的值。

我建议使用不同的方法:

SELECT TOP 10 ING_LOC_DESCRIPTION
FROM [CDRS].[ING_LOC_TRANS_MASTER]
WHERE CHARINDEX(@strSearch, ING_LOC_DESCRIPTION) > 0
ORDER BY [ING_LOC_ID];

简单字符串匹配中没有通配符。

【讨论】:

  • 谢谢大家,我想你已经搞定了。
【解决方案2】:
【解决方案3】:

[ ] 字符在 T-Sql LIKE 中具有特殊含义 - 它们用于模式搜索。

例如:WHERE column LIKE '[a-c]%' 将返回所有columnabc 开头的记录,而WHERE column LIKE '[^a-c]%' 将返回所有Column 不以a 开头的记录, bc.

您可以通过将[ 字符包裹在[] 中来转义它:WHERE column LIKE '[[]a]%' 将返回列以[a] 开头的所有记录(无需转义右括号)。

如需更多信息,请阅读同一页面下方的arguments of the like operatorUsing Wildcard Characters As Literals

【讨论】:

    【解决方案4】:

    Gordon 的回答可能是最巧妙的方法,但这里有一个使用 ESCAPE 的示例:

    SELECT TOP 10 ING_LOC_DESCRIPTION
    FROM [CDRS].[ING_LOC_TRANS_MASTER]
    WHERE [ING_LOC_DESCRIPTION] LIKE '%'+@strSearch+'%' ESCAPE '['
    

    您只需要转义其中一个方括号,以避免方括号绑定字符类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      相关资源
      最近更新 更多