我的查询是:
declare @param1 INT,
@param2 nvarchar(max)
set @param1 = 1
set @param2 = '[Test_data_forQry],[Next_Test_Data]'
SELECT *
FROM Table1
WHERE
ColumnA = @param1
AND (',' + @param2 +',' LIKE '%,' + CONVERT(VARCHAR, ColumnB) + ',%');
Run Code Online (Sandbox Code Playgroud)
方括号和下划线阻止数据获取。我的问题是我应该在查询的最后一行中放置转义“\” 。我也尝试过REPLACE选项,但没有用
set @param1 = 1
set @param2 = '[Test_data_forQry],[Next_Test_Data]'
set @param2 = replace (replace(@param2 , '[', '[[]'), '_','[_]')
SELECT *
FROM Table1
WHERE
ColumnA = @param1
AND (',' + @param2 +',' LIKE '%,' + CONVERT(VARCHAR, ColumnB) + ',%');
Run Code Online (Sandbox Code Playgroud)
您需要首先转义所有 LIKE 字符并使用ESCAPE运算符。另外,默认情况下,您将 ColumnB 转换为 VARCHAR 仅是 VARCHAR(30),因此 ColumnB 中的数据被截断并且不匹配,因为 @param2 本身是 35 个未转义的字符。
见下文:
DECLARE @param1 INT, @param2 NVARCHAR(MAX);
SET @param1 = 1
SET @param2 = '[Test_data_forQry],[Next_Test_Data]'
-- Replace LIKE special characters
SET @param2 = REPLACE(REPLACE(REPLACE(REPLACE(@param2, '[', '|['), ']', '|]'), '%', '|%'), '_', '|_')
SELECT *
FROM Table1
WHERE
ColumnA = @param1
AND CONVERT(NVARCHAR(MAX), ColumnB) LIKE ('%,' + @param2 +',%') ESCAPE '|';
Run Code Online (Sandbox Code Playgroud)
编辑:如果您的 ColumnB 数据确实具有您在评论之一中指出的“[Test_data_forQry]”等示例数据,则将其像这样切换并转义 ColumnB 而不是 @param2:
DECLARE @param1 INT, @param2 NVARCHAR(MAX);
SET @param1 = 1
SET @param2 = '[Test_data_forQry],[Next_Test_Data]'
SELECT *
FROM Table1
WHERE
ColumnA = @param1
AND @param2 LIKE '%' + REPLACE(REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(MAX), ColumnB), '[', '|['), ']', '|]'), '%', '|%'), '_', '|_') + '%' ESCAPE '|';
Run Code Online (Sandbox Code Playgroud)
对于性能来说可能不太好,因为在 where 发生了这么多事情,但这将匹配 ColumnA = 1 和 ColumnB = '[Test_data_forQry]' 的行。
更新: 更新为用逗号分割搜索字符串(可能需要首先从这里创建一个函数):
DECLARE @param1 INT, @param2 NVARCHAR(MAX);
SET @param1 = 1
SET @param2 = '[Test_data_forQry],[Next_Test_Data]'
-- Replace LIKE special characters
SET @param2 = REPLACE(REPLACE(REPLACE(REPLACE(@param2, '[', '|['), ']', '|]'), '%', '|%'), '_', '|_')
SELECT DISTINCT t.*
FROM Table1 t
INNER JOIN dbo.split(@param2, ',') split ON 1=1
WHERE
t.ColumnA = @param1
AND CONVERT(NVARCHAR(MAX), t.ColumnB) LIKE ('%' + split.s + '%') ESCAPE '|';
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
918 次 |
| 最近记录: |