Oracle“开头为”文字链接,不包括空值

hiz5n14c  于 2022-12-03  发布在  Oracle
关注(0)|答案(4)|浏览(125)

我遇到了一些麻烦。我正在尝试构建一个使用“开始于”逻辑的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子句不匹配空字段。
提前感谢您的帮助!

nnsrf1az

nnsrf1az1#

试试这个

select user.name 
from user user
inner join salesperson spn 
on spn.salesperson_code like nvl(trim(user.employee_code),'-') || '%'
4dc9hkyq

4dc9hkyq2#

尝试

select user.name 
from user user
inner join salesperson spn
  on spn.salesperson_code like DECODE (user.employee_code,
                                         NULL, NULL, 
                                               user.employee_code || '%')
oyjwcjzk

oyjwcjzk3#

我建议使用正则表达式来提取销售人员代码的非数字部分,也可以选择提取数字部分。为具有这些添加字段的表创建视图,或者将其用作查询中的表表达式。

SELECT regexp_substr(salesperson_code,'\D+') AS employee_code,
       regexp_substr(salesperson_code,'\d+') AS employee_sales_no,
       salesperson_name, salesperson_code
FROM salesperson

注意:正则表达式分别匹配一个或多个非数字和一个或多个数字。

niwlg2el

niwlg2el4#

添加IS NOT NULL条件:

select *
from user
inner join salesperson spn
        on spn.salesperson_code like user.employee_code || '%'
       and user.employee_code is not null;

相关问题