为什么这样做,
select*
from some_table
WHERE some_column_name like '%i%'
而不是这个?
select*
from some_table
WHERE
some_column_name like (select ''''+'%' +value +'%' + '''' as val
from [dbo].[fn_Split](' i this is a test testing Chinese undefined',' ')
where idx = 0)
我正在尝试搜索单个单词而不是整个短语,上面的split函数会将字符串拆分为空格字符,并将结果插入到包含两列idx和value的表中。
答案 0 :(得分:0)
一个可能的原因是因为您将单引号附加到字符串的开头和结尾,并且没有任何值实际存储字符串中的单引号。
另一个原因可能不起作用是因为子查询返回多行或零行。函数fn_split()
是你自己的函数,所以我不知道它返回什么。您在上下文中有一个子查询,它最多可以返回一行和一列。这称为标量子查询。如果子查询返回多行,则会出错。如果子查询没有返回任何行 - 例如,如果idx
从1开始计数而不是0,那么它将返回NULL
,这将导致测试失败。
如果您想以这种方式找到匹配项,我建议exists
:
select t.*
from some_table t
where exists (select 1 as val
from [dbo].[fn_Split](' i this is a test testing Chinese undefined',' ') s
where s.idx = 0 and
t.some_column_name like '%' + value + '%'
);
答案 1 :(得分:0)
LIKE运算符为参数接受一个字符串。它不能在表上使用,我假设你的函数返回。
我认为你想要做的是加入函数,然后检查LIKE fn.Value:
select *
from some_table t
INNER JOIN (select value as val
from [dbo].[fn_Split](' i this is a test testing Chinese undefined',' ')
where idx = 0) f
ON t.some_column_name like '%'+f.val+'%'
如果保证子查询只返回一个结果,你可以尝试将模数符号放在它周围而不是在其中:
LIKE '%' + (YourSubQuery) + '%'
答案 2 :(得分:0)
子查询的结果是文字字符串。 %符号不被视为通配符。此外,您的函数是否返回多行?如果是这样,LIKE运算符只能计算单个值。
如果您的函数确实返回单个值,我建议您考虑使用Dynamic SQL。如下所示:
DECLARE @SQL VARCHAR(MAX), @WildCard VARCHAR(MAX)
SELECT @WildCard = '%' + value + '%'
FROM [dbo].[fn_Split](' i this is a test testing Chinese undefined',' ')
WHERE idx = 0
SET @SQL = 'SELECT * FROM some_table WHERE some_column_name like ''' + @WildCardWildCard + ''''
EXEC(@SQL)