sql,在like运算符中使用子查询
为什么会这样呢,sql,在like运算符中使用子查询,sql,sql-server,Sql,Sql Server,为什么会这样呢, 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 Chin
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)的表中 一个可能的原因是,您在字符串的开头和结尾添加了单引号,并且没有一个值实际在字符串中存储单引号 另一个原因是可能不起作用,因为子查询返回多行或零行。函数
fn\u 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 + '%'
);
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) + '%'
子查询的结果是一个文本字符串。%符号不被视为通配符。另外,函数是否返回多行?如果是这样,LIKE运算符只能计算单个值 如果您的函数确实返回单个值,我建议您考虑使用动态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)
你确定这个分割函数会在空白处分割吗?据我所知,很多分割函数都不会。试着将结果浓缩到一个变量中,并在“like”子句中使用它。idx从0开始计数。运行此子查询将返回一个值、一行、一列,它是“%i%”。此实例中的子查询返回的值仅为“%i%”。值i是从表中选择的,如果子查询保证只返回一个结果,则附加单引号和模符号以给出结果“%i%”,您可以尝试将模符号放在它的周围而不是里面:“比如“%”+(您的子查询)+“%””