SQL Server中与FIND_IN_SET()函数等效的函数是什么?

5
SELECT * FROM users WHERE uid IN (SELECT doctors FROM MainPage WHERE Valid=1)

users表格 uid INT
Mainpage表格 doctors text 值为 1,2,3,4,5

当我运行上述查询时,只会返回一个uid=1的行,但是我想要所有5个行。因此在MySQL中,我使用了以下查询:

SELECT *
FROM users
JOIN MainPage ON FIND_IN_SET(uid, doctors)
WHERE Valid = 1;

已解决。我正在尝试在SQL Server中找到FIND_IN_SET的等价物,以达到相同的结果?


在MySQL中,我假设您有一个SET类型的列。最接近它的匹配将是一个INT或BIGINT列,用作标志位图。 - Ben
4
也许你可以改变设计,不要将多个事实存储为单个值 - 换句话说,应该有一个表,其中包含DoctorID和UID列,都是整数。如果不能用正确的方式处理,你需要一个拆分函数。在SQL Server 2016中,你可以使用STRING_SPLIT,但在此之前,你的选择有限且效率不高 - Aaron Bertrand
2个回答

6

这可能会有效

SELECT *
FROM users u
WHERE EXISTS (
    SELECT *
    FROM MainPage
    WHERE CONCAT(',',doctors,',') LIKE CONCAT('%,',u.uid,',%')
        AND Valid = 1
)

我在 DVT 中尝试了一下,查询仅考虑了 1。我们还能尝试其他的吗? - Oggu
我的疏忽,它的功能是正确的。但看起来性能会受到影响! - Oggu
我找到了另一种方法!! - Oggu
声明 @x varchar(1000),设置 @x=(从 mainpage 表中选择 doctors 字段 where valis=1)。执行 'SELECT * FROM users u WHERE uid in ('+@x+')'。 - Oggu

2
自 SQL Server 2016 (13.x) 开始,有 STRING_SPLIT() 函数。
SELECT *
FROM users
WHERE uid IN
 (SELECT value FROM STRING_SPLIT(
     (SELECT doctors FROM MainPage WHERE Valid = 1),
     ','))

似乎整个问题是XY问题。https://dev59.com/QnRC5IYBdhLWcg3wUvQS#36980115 - Lukasz Szozda
@LukaszSzozda,我不同意。虽然乍一看它看起来与参数化查询相关,但这个问题与之无关。这里是一个案例,当您在数据库中存储逗号分隔的ID列表时。 - Vasiliy Zverev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接