Oracle“Starts With”文本连接,不包括空值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle“Starts With”文本连接,不包括空值相关的知识,希望对你有一定的参考价值。

我遇到了一些麻烦。我正在尝试构建一个使用“启动”逻辑的SQL查询。首先是一点背景......

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

约翰史密斯的“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子句。

预先感谢您的帮助!

答案

试试这个

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

尝试

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

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

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

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

另一答案

添加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;

以上是关于Oracle“Starts With”文本连接,不包括空值的主要内容,如果未能解决你的问题,请参考以下文章

starts with an A and ends with an N是什么意思?

python字符串相关函数 *title *upper *lower *swapcase *len *count *find *index *starts with *endswith

Oracle SQL:如何连接文本直到达到最大大小

oracle的服务无法连接数据库

通过连接文本选择列作为oracle中的列名

plsql连接ORacle数据库时报:因目标主机或对象不存在,连接失败。怎样解决