2014-11-25 90 views
0

选择缺少的行我有一个SQL表像下面的使用SQL LIKE

RoleId  Roles 
------------------------------------------ 
    1   Administrators Viewers Users Managers 
    2   Administrators Viewers Managers 
    3   Administrators 
    4   Viewers 

我需要得到一个基于角色的RoleId的。我将每个角色都视为一个字符串。

所以,当我使用下面的查询

SELECT * 
FROM Roles 
WHERE Roles like '%Administrators Viewers Managers%' 

我得到的只有前两排

RoleId  Roles 
-------------------------------------------------- 
    1   Administrators Viewers Users Managers 
    2   Administrators Viewers Managers 

但我需要它,因为它包含了AdministratorsViewers太获取剩余的行。 我实际上使用存储过程来提供角色作为参数。所以它并不总是一样的。 其动态。我不能使用OR。我需要一个适用于任何参数的解决方案。

INLIKE子句之间是否有组合?

要不我怎么能继续

+3

嗯,这是一个有兴趣的方法,但似乎不喜欢一个很好的长期解决方案。我想理想情况下你会有两张桌子,这会让你稍后变得更加灵活......即。角色和权限...即。 'ROLES TABLE:roleID 1 = Admin,roleID 2 = Viewer' 'PERMISSIONS TABLE:roleID = 1,view = yes,admin = yes,edit = yes; roleId = 2,view = yes,admin = no,edit = no'。然后你就可以做更复杂的查询。 – timh 2014-11-25 10:18:38

+0

如何获得第1行的查询? – 2014-11-25 10:18:46

+0

上面提供的脚本不会记录'管理员查看者用户管理器',因为'用户'没有在您的LIKE子句中指定。如果你的参数是动态的,我会建议DSQL。声明一个参数,写出你的查询并执行。但我不确定如何将参数分成3个(管理员/查看者/管理员)变量。 – PKirby 2014-11-25 10:41:57

回答

2

您可以使用OR

SELECT * 
FROM Roles 
WHERE Roles like '%Administrators%' 
OR Roles like '%Viewers%' 
+0

我实际上使用存储过程来提供角色作为参数。所以它并不总是一样的。它的动态。 – 2014-11-25 10:21:29

+1

@Targarian:那么参数是什么类型?我会规范你的表格。创建另一个表来存储属于角色的“子角色”。 – 2014-11-25 10:28:42

0
SELECT * FROM Roles 
WHERE Roles like '%Administrators%' OR Roles like '%Viewers%' 
OR Roles like '%Administrators Viewers%' 
+0

您可以添加一些额外的信息以及答案吗? – Max 2014-11-25 10:59:42

+0

由于前两个,不是第三个LIKE是完全多余的吗? – Mike 2014-11-25 15:56:19

0

如果dynamically通过roles作为参数使用,如下面的查询 为

SQL Server 2000及以上版本

SELECT * 
FROM Roles 
WHERE Roles like '%'[email protected]+'%' 

SQL Server 2008和以上

SELECT * 
FROM Roles 
WHERE Contains(Roles,@Roles) 

,但上面的查询会产生只是基于roles你已经通过了结果