【问题标题】:Oracle SQL - Join keysOracle SQL - 连接键
【发布时间】:2016-11-25 21:53:37
【问题描述】:

这些是我的表格和示例记录:

DEPARTMENT.Dept_nbr  (VARCHAR)
---------------------
(NULL)
UNK
00309
309

FPLAN.Department (NUMBER)
---------------------
D0309

场景:

我希望 FPLAN.Department (D0309) 作为参考,并显示 DEPARTMENT.Dept_nbr 值。

我的代码:

select 
TRIM(REPLACE(FPL.DEPARTMENT, 'D')) as DEPARTMENT , DEPT.*
from
FPLAN FPL ,
(
select distinct(TRIM(LEADING 0 FROM DEPT_NBR)) DEPT_NBR from DEPARTMENT
) DEPT
WHERE
TRIM(LEADING 0 FROM FPL.DEPARTMENT) = DEPT.DEPT_NBR;

这不会带来任何结果。

我需要做什么才能得到这个 DEPT_NBR:

00309
309

【问题讨论】:

  • 00309 和 309 应该按照什么逻辑匹配 D0309?
  • 这个问题已经解决了。谢谢你的时间。
  • 这不是您的私人服务网站。希望每一个问题和答案都能在未来对其他人有所帮助。你得到了免费的建议,这对你有帮助。 “向前支付”您至少可以做的是澄清问题所在,这样其他人就会知道答案是否也适用于他们的问题。太糟糕了,这对你的时间要求太高了。

标签: sql oracle join inner-join


【解决方案1】:

对嵌套查询和执行顺序的评论

内部查询保证在外部查询之前执行,因此保护您免受错误的转换尝试。


create table t (x varchar2(10)); 

insert into t(x) values ('X123'); 

select  * 
from    (select x from t where regexp_instr(x,'([^0-9])') = 0) 
where   to_number (x) > 3
;

[代码:1722,SQL 状态:42000] ORA-01722:无效号码

受保护的代码 -

select  * 
from    t
where   to_number(case regexp_instr(x,'([^0-9])') when 0 then x end) > 3
;

【讨论】:

    【解决方案2】:

    如果您有意义的字符串始终采用“DXXXX”格式,其中 XXXX 表示数字,您可以将所有内容转换为数字,然后比较数值:

    select Dept_nbr
    from (
         select *
         from DEPARTMENT
         where regexp_instr( Dept_nbr,'([^0-9])') = 0
         ) 
           inner join FPLAN
             on ( to_number(trim( 'D' from Department)) = to_number(Dept_nbr) )
    

    【讨论】:

    • 现在我检查了数据类型:FPLAN 是 NUMBER,而 DEPARTMENT 是 VARCHAR。
    • @boombox2014: FPLAN 是一个数字并且包含'D0309'?
    • 哦,对不起.. 它是 varchar。两者都是 varchars
    • @boombox2014 所以,如果 DEPARTMENT 的格式总是 D00000 并且 Dept_nbr 只包含数字,这应该可以工作
    • 我在 DEPT_NBR 中看到了 UNK 和 NULL 值。 :(
    【解决方案3】:

    SQL 服务器

    如果该字段已经是一个字符串,这将起作用

    SELECT RIGHT('000'+ISNULL(field,''),3) 如果您希望空值显示为 '000'

    它可能是一个整数——然后你会想要

    SELECT RIGHT('000'+CAST(field AS VARCHAR(3)),3) 复制自here

    【讨论】:

    • 都是varchar数据类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2012-05-13
    • 2012-06-23
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多