【问题标题】:Using LIKE and IN and a Subquery in a single SQL Statement在单个 SQL 语句中使用 LIKE 和 IN 以及子查询
【发布时间】:2013-03-22 00:51:45
【问题描述】:

我正在编写一个查询,其中我试图在子查询/CTE 中搜索通配符子字符串,并将此逻辑嵌套在我的 CASE 语句中。例如:

SELECT
CASE 
WHEN '%' + text + '%' IN (SELECT Column1 FROM Table) THEN 'I am in Column1'
ELSE text END
FROM Table

不幸的是,似乎没有办法做到这一点。因为我需要使用 LIKE 运算符并且无法同时使用 LIKE 和 IN。我必须分别编写每个 LIKE 语句,这将是 1000 多行。有没有人推荐更直接的解决方案?提前致谢!

-- 编辑:对不起,每个 cmets 的一些说明。一个更好的例子:

UserID     |  UserPeers   |  Gender
--------------------------------------------
Mike       |  Tom1, Bob1  |  M
John       |  Tom1, Greg1 |  M
Sally      |Mike1, John1  |  F
Sara       | Sally1, Bob1 |  F

在上表中,我需要搜索 UserPeers 列中的子字符串,以查看它们是否存在于 UserID 列中的任何位置。在这种情况下将成功返回的行将是 Sally 和 Sara 下的行,因为 UserID 下存在“Mike”和“Sally”。

SELECT *
FROM Users
WHERE '%' + UserPeers + '%' LIKE (SELECT UserID FROM Users)

这里返回的错误是: 子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

【问题讨论】:

  • 请用一些示例数据澄清一下。对条件进行 AND 运算呢?
  • 不确定我是否关注。您是否只想将text 列与同一行中的Column1 进行比较? text 是变量还是列名?
  • 感谢大家的广泛回复,Aaron 的初步回答成功了。卡在 LIKE 上。非常感谢!

标签: sql tsql sql-server-2008-r2 sql-like


【解决方案1】:
SELECT UserID, CASE WHEN EXISTS 
(
  SELECT 1 FROM dbo.Users WHERE UserPeers LIKE '%' + u.UserID + '%'
) THEN 'I am in Column1' ELSE UserID END
FROM dbo.Users AS u;

【讨论】:

    【解决方案2】:

    这是一种方法:

    SELECT (CASE WHEN exists (select 1 from table t2 where t2.column1 like '%' + t.text + '%')
                 then 'I am in Column1'
                 ELSE t.text
            END)
    FROM Table t;
    

    您的原始查询似乎在like 的错误一侧使用了通配符。

    【讨论】:

      【解决方案3】:

      你可以试试这样的:

      选择 情况下 (select count(*) from table where column1 like ('%' + text + '%')) > 0 then 'I am in column1' 其他文字 结尾 从表

      【讨论】:

      • 当您不关心实际计数时,计数可能会非常昂贵和浪费。 EXISTS 保证不会更糟,但通常会更好。
      【解决方案4】:

      可能你真的不需要LikeIN

      
      SELECT
      CASE 
      WHEN EXISTS (SELECT 1 FROM Table B WHERE B.COLUMN1 LIKE '%' + A.TEXT+ '%') THEN 'I am in Column1'
      ELSE A.text END
      FROM Table A 
      

      【讨论】:

      • 你不是要关联子查询吗?
      • 是的,我的意思是关联子查询,但我不确定 @thoughtExperiment 是否需要 key=key。
      • 也不确定。如果给我这些要求,我会把它们扔回去;在这种情况下,我们所能做的就是猜测。 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 2010-10-14
      • 2014-05-26
      • 2011-05-18
      相关资源
      最近更新 更多