sql,在like运算符中使用子查询

时间:2014-08-20 18:15:24

标签: 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 Chinese undefined',' ')
                         where idx = 0)

我正在尝试搜索单个单词而不是整个短语,上面的split函数会将字符串拆分为空格字符,并将结果插入到包含两列idx和value的表中。

3 个答案:

答案 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)