Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql,在like运算符中使用子查询_Sql_Sql Server - Fatal编程技术网

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%”,您可以尝试将模符号放在它的周围而不是里面:“比如“%”+(您的子查询)+“%””