3

我正在编写一个查询,其中我试图在子查询/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 多行。有人推荐更直接的解决方案吗?提前致谢!

- 编辑:对不起,每条评论都有一些澄清。一个更好的例子:

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 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。

4

4 回答 4

3
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;
于 2013-03-31T22:20:19.053 回答
0

这是一种方法:

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.

于 2013-03-31T22:19:12.967 回答
0

可能你真的不需要Like并且IN


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 
于 2013-03-31T22:19:56.330 回答
0

你可以尝试这样的事情:

选择 case when (select count(*) from table where column1 like ('%' + text + '%')) > 0 then 'I am in column1' else text end from table

于 2013-03-31T22:19:59.863 回答