Oracle:从视图中选择,但从目标表中选择where子句值



TARGET_TABLE:

id   | col1 
------------
1      'mySample1234'
2      'mySample3456'

MY_VEIW:的当前sql

select substr(col1,-4,4) from TARGET_TABLE;

我的查询:

select * from MY_VEIW where col1 = 'mySample1234';

我的结果:

Empty

预期结果:

id   | col1
------------
1      '1234'

换句话说,我想通过"TARGET_TABLE的值"进行选择,而不考虑"MY_VIEW的过滤值"。

如何做到这一点

尝试使用Regexp_replace

select regexp_replace(col1 , '[A-Za-z]') 
From TARGET_TABLE

我不确定我是否理解。。。您的基表中是否有一个名为col1的列,然后提取最后四个字符,将它们放在视图中的一个同样名为coll的列中,然后您想从视图中进行选择?

如果是这样的话,我理解"1234"是"mySample1234"的最后四个字符。完整字符串在基表中,"1234"在视图中。您希望"1234"="mySample1234"如何返回除false以外的任何值?MY_VIEW中的col1只是"1234",而不是完整的原始字符串。

若要从MY_VIEW返回行,必须使用WHERE col1 = '1234'进行筛选。或者,如果您试图查看TARGET_TABLE中col1的最后四个字符是否与较长字符串的最后四位字符匹配,则可以使用WHERE col1 = SUBSTR('mySample1234', -4)(或SUBSTR中的任何其他比较字符串)。

添加:如果您试图将MY_VIEW中的col1与TARGET_TABLE中对应的col1匹配,例如在联接中,您可以这样写:

ON  (or WHERE ...)   MY_VIEW.col1 = SUBSTR(TARGET_TABLE.col1, -4)

只需使用两个参数:

select substr(col1, -4)
from TARGET_TABLE;

然而,如果这不起作用:

select * from MY_VEIW where col1 = 'mySample1234';

那么原因是col1在底层中,而不是视图中。我想你想要:

create view my_view as
    select col1, substr(col1, -4) as last4
    from TARGET_TABLE;

然后你可以使用:

select *
from MY_VEIW
where col1 = 'mySample1234';

或者:

select *
from MY_VEIW
where last4 = '1234';

最新更新