首页 > 解决方案 > 在 sql 中将 LIKE 和 IN 与子查询一起使用

问题描述

我正在使用 Oracle SQL,我有以下表格:

用户

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

特殊用户

UserID     
-------
Tom1       
John1      

我正在尝试获取special_users表中存在对等点的所有用户。

我的尝试:

SELECT * 
FROM user 
WHERE '%' UserPeers '%' LIKE IN (SELECT UserID FROM special_users)

显然语法是错误的,所以我不确定我会怎么做?

预期结果:

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

标签: sqloracle

解决方案


您可以将要匹配的字符串和包含userid要匹配的字符串包装在, 分隔符中,以确保匹配完整userid(而不是天真地使用LIKE而不考虑周围的分隔符而只匹配部分userid)。像这样:

SELECT *
FROM   "USER" u
WHERE  EXISTS (
  SELECT 1
  FROM   special_user su
  WHERE  ', ' || u.userpeers || ', ' LIKE '%, ' || su.userId || ', %'
)

其中,对于样本数据:

CREATE TABLE "USER" ( UserID, UserPeers, Gender ) AS
SELECT 'Mike',  'Tom1, Bob1',   'M' FROM DUAL UNION ALL
SELECT 'John',  'Tom1, Greg1',  'M' FROM DUAL UNION ALL
SELECT 'Sally', 'Mike1, John1', 'F' FROM DUAL UNION ALL
SELECT 'Sara',  'Sally1, Bob1, TimTom1', 'F' FROM DUAL;

CREATE TABLE special_user ( UserID ) AS
SELECT 'Tom1' FROM DUAL UNION ALL
SELECT 'John1' FROM DUAL;

注意:我更改Sally为添加一个TimTom1即使包含子字符串也不应该匹配的对等Tom1点。

哪个输出:

用户身份 用户同行 性别
麦克风 汤姆1,鲍勃1
约翰 汤姆1,格雷格1
莎莉 迈克1,约翰1 F

db<>在这里摆弄


推荐阅读