1

我遇到了一些麻烦。我正在尝试构建一个使用“开始于”逻辑的 SQL 查询。先说一点背景...

在我负责编写报告的数据库中,有一个“用户”表和一个“销售人员”表,销售人员属于一个用户。在一个不太聪明的举动中,数据库的设计者决定通过子字符串匹配销售人员与他们的员工代码相关联。例如:

John Smith 的“employee_code”将是“JS”。但他有多个“销售人员”来区分他不同的销售类型。所以他可能有“JS1”、“JS2”、“JS3”等,作为他的“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 有一个与空白字段不匹配的开头子句。

预先感谢您的帮助!

4

4 回答 4

0

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

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

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

于 2013-04-22T01:22:33.180 回答
0

尝试这个

select user.name 
from user user
inner join salesperson spn 
on spn.salesperson_code like nvl(trim(user.employee_code),'-') || '%'
于 2013-04-18T21:54:13.950 回答
0

尝试

select user.name 
from user user
inner join salesperson spn
  on spn.salesperson_code like DECODE (user.employee_code,
                                         NULL, NULL, 
                                               user.employee_code || '%')
于 2013-04-18T21:54:23.810 回答
0

添加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;
于 2017-02-08T05:57:08.517 回答