我有一个需要进行一些更改的查询,我不知道这样做:
这是我的疑问:
select * from user_data a
left join user_group b
on (a.role like b.role)
实际上,userdata中的角色值是(varchar)'staff'
和组中的角色值是(varchar)'staff; security; finance'
所以我得不到我期望的结果..
我想这个查询应该类似于:
select * from user_data a
left join user_group b
on (b.role like a.role+";%") // using wildcard
我仍然不知道在这种情况下使用通配符的正确查询
任何人都可以提供帮助吗?
答案 0 :(得分:5)
您可以使用CONCAT
:
select * from user_data a
left join user_group b
on (b.role like CONCAT(a.role,";%")) // using wildcard
注意 - b.role
只需要在开头匹配a.role
吗?如果它是security;staff;finance
怎么办?你可以做CONCAT('%',a.role,'%')
。
您可以CONCAT('%','a.role','%')
在任意位置处理匹配的a.role
,但只有在时才能确定您不会拥有嵌套角色。
例如:如果b.role
为staff
且a.role
为finance;gardenstaff;security
,则即使角色为gardenstaff
而非工作人员,也会从查询中返回此行
作为替代方案,您可以使用RLIKE
代替LIKE
。这基本上是LIKE
的正则表达式。
特别是,正则表达式[[:<:]]staff[[:>:]]
将匹配整个单词 staff
。 [[:<:]]
和[[:>:]]
代表字边界,阻止您与staff
中的gardenstaff
进行匹配。
因此,您的查询可能是:
select * from user_data a
left join user_group b
on (b.role RLIKE CONCAT('[[:<:]]',a.role,'[[:>:]]'))
这适用于b.role
以分号分隔的a.role
中的任何位置。