Oracle"从"开始文本连接,不包括空值

时间:2013-04-18 21:50:36

标签: oracle sql-like startswith

我遇到了一些麻烦。我正在尝试构建一个使用“启动”逻辑的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              |
|------------------|------------------|

salesperson表上没有外键将它们链接到用户表,只有员工代码中的子字符串。

我不记得我在哪里找到了这个答案,但在我的查询中我一直这样做:

select user.name 
from user user
inner join salesperson spn on spn.salesperson_code like user.employee_code || '%'

这个逻辑成功地完成了“开始于”匹配。但是,有些用户具有空白员工代码,并且他们也匹配此查询。

我在寻找什么:如何修改此查询,以便如果employee_code为空,则不匹配?我是Oracle查询的新手。其他DBMS'有一个与空白字段不匹配的starts子句。

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:0)

试试这个

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

答案 1 :(得分: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 || '%')

答案 2 :(得分: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 

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

答案 3 :(得分: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;