我遇到了一些麻烦。我正在尝试构建一个使用“开始于”逻辑的SQL查询。首先有一点背景知识...
在我负责编写报表的数据库中,有一个“user”表和一个“salesperson”表,其中的销售人员属于一个用户。数据库的设计者决定通过一个子字符串匹配将销售人员与其雇员代码相关联,这是一个不太明智的做法。例如:
John Smith的“employee_code”是“JS”。但是他有多个“salesperson”来区分他的不同销售类型。因此他可能有“JS 1”、“JS 2”、“JS 3”等作为他的“salesperson_code”。
举例说明:
user table:
|----------|-----------|----------|---------------|
| username | firstname | lastname | employee_code |
|----------|-----------|----------|---------------|
| JSMITH | John | Smith | JS |
|----------|-----------|----------|---------------|
salesperson table:
|------------------|------------------|
| salesperson_name | salesperson_code |
|------------------|------------------|
| John Smith 1 | JS1 |
| John Smith 2 | JS2 |
| John Smith 3 | JS3 |
|------------------|------------------|
销售人员表上没有外键将他们链接到用户表,只有来自雇员代码得子字符串.
我不记得我在哪里找到了这个答案,但在我的疑问中我一直在这样做:
select user.name
from user user
inner join salesperson spn on spn.salesperson_code like user.employee_code || '%'
此逻辑成功地匹配了“开头为”。但是,存在员工代码为空的用户,这些用户也匹配此查询。
我在寻找什么:**我如何修改此查询,以便在employee_code为空时不匹配?**我对Oracle查询比较陌生。其他DBMS的starts with子句不匹配空字段。
提前感谢您的帮助!
4条答案
按热度按时间nnsrf1az1#
试试这个
4dc9hkyq2#
尝试
oyjwcjzk3#
我建议使用正则表达式来提取销售人员代码的非数字部分,也可以选择提取数字部分。为具有这些添加字段的表创建视图,或者将其用作查询中的表表达式。
注意:正则表达式分别匹配一个或多个非数字和一个或多个数字。
niwlg2el4#
添加
IS NOT NULL
条件: