我有一个需要一些更改的查询,我没有得到任何线索这样做:
这是我的查询:
select * from user_data a
left join user_group b
on (a.role like b.role)
Run Code Online (Sandbox Code Playgroud)
实际上userdata中的角色值是(varchar)'staff'
和组中的角色价值是(varchar)'员工;安全;财务'
所以我没有得到我预期的结果..
我想这个查询应该类似于:
select * from user_data a
left join user_group b
on (b.role like a.role+";%") // using wildcard
Run Code Online (Sandbox Code Playgroud)
我仍然不知道使用通配符对这种情况的正确查询
任何人都可以帮忙吗?
你可以使用CONCAT:
select * from user_data a
left join user_group b
on (b.role like CONCAT(a.role,";%")) // using wildcard
Run Code Online (Sandbox Code Playgroud)
注意 - 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,'[[:>:]]'))
Run Code Online (Sandbox Code Playgroud)
这适用b.role于以分号分隔的任何地方a.role.
| 归档时间: |
|
| 查看次数: |
1467 次 |
| 最近记录: |