Oracle SQL - 查询结果与查询变量是整数与字符串时不一致

时间:2018-04-10 15:15:33

标签: sql oracle

我有一个名为'svc_id_value'的数据库字段,其中包含字母数字值和整数值。

我有一个查询来搜索与此服务ID相关的详细信息。当我的输入变量是一个整数时,查询工作正常,但是当我尝试使用字母数字字符串进行相同的查询时,结果将返回空。问题VARCHAR2(30Byte)中的字段(svc_id_value)。我可以在数据视图中成功过滤Oracle SQL Developer中的字母数字变量,但是当我在SQL Developer中查询它时,结果会变回空白。

工作查询(字符串为整数 - 搜索s.svc_id_value ='555555'):

    SELECT * 
    from svc s, status_types stat, service_types st,
    billing_types bt, account ax, building pp, locations ll, 
    ref_countries cx 
    WHERE 
    s.svc_status = stat.status_type 
    and stat.tablename='service' 
    and s.svc_type = st.service_type 
    and s.svc_billing_type = bt.billing_type 
    and ax.account_id = s.svc_account_id 
    and pp.bldg_id = s.svc_bldg_id 
    and ll.location_id = s.svc_location_id 
    and cx.id = ll.country_id 
    and s.svc_id_value ='555555';

非工作查询(字符串为字母数字 - 搜索s.svc_id_value ='88888888-ABC'):

    SELECT * 
    from svc s, status_types stat, service_types st,
    billing_types bt, account ax, building pp, locations ll, 
    ref_countries cx 
    WHERE 
    s.svc_status = stat.status_type 
    and stat.tablename='service' 
    and s.svc_type = st.service_type 
    and s.svc_billing_type = bt.billing_type 
    and ax.account_id = s.svc_account_id 
    and pp.bldg_id = s.svc_bldg_id 
    and ll.location_id = s.svc_location_id 
    and cx.id = ll.country_id 
    and s.svc_id_value ='88888888-ABC';

要确认通过字母数字变量查询是否有效,以下简单查询会成功返回结果:

    SELECT * from svc s WHERE s.svc_id_value='88888888-ABC'

我不明白为什么查询可以使用整数,但是当它是字母数字时失败。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

要解决此类问题,我将所有内部联接更改为外部联接,如下所示:

SELECT * 
from svc s
LEFT JOIN status_types stat
    ON s.svc_status = stat.status_type 
    AND stat.tablename='service' 
LEFT JOIN service_types st
    ON s.svc_type = st.service_type 
LEFT JOIN billing_types bt
    ON s.svc_billing_type = bt.billing_type 
LEFT JOIN account ax
    ON ax.account_id = s.svc_account_id 
LEFT JOIN building pp
    ON pp.bldg_id = s.svc_bldg_id 
LEFT JOIN locations ll
    ON ll.location_id = s.svc_location_id 
LEFT JOIN ref_countries cx 
    ON cx.id = ll.country_id 
WHERE s.svc_id_value ='88888888-ABC';

这样,您应该返回一行,然后您可以浏览结果。至少有一个连接表将具有空值,这就是您在原始内连接查询中返回零行的原因。