2010-09-16 52 views
4

我有一个主表(以下称SURVEY)和一个详细表(以下称为ANSWERS)。不出所料,ANSWERS已经回答了SURVEY问题。 ANSWERS有一个名为TEXT的VARCHAR2列。一些ANSWERS.TEXT值是真正的文本,但有些实际上是数字。幸运的是,我总是知道哪些行包含文本,哪些行包含数字作为文本。to_number()的另一个问题。我简直不明白

这是这样的。我无法改变这一点。

回到当天,当某些ANSWERS行被保存时,他们的TEXT值被樱桃采摘并放入SURVEY表中正确类型的列中。一个简单的单表格选择将获取SURVEYs和特殊值。

但是现在,随着新应用程序的添加,我们删除了特殊列。相反,我们现在必须获取相应的ANSWERS行'TEXT值。

我已经创建了一个模拟旧的琐碎选择语句的查询。它工作得很好......主要是。

这里有一个片段:

select survey.*, 
     j2.overall_score 
    from survey, 
     (select to_number(trim(ANSWER.text)) overall_score, 
       survey.id survey_id 
      from ANSWER, 
       [edited - more SQL that gets the 'score' row from ANSWERS]) j2  
where 
    survey.id=j2.survey_id 
    and overall_score > 70  

您可能注意到了J2。在真正的查询中,有六个这样的列,j1到j6。当我运行查询时,它看起来像旧查询只是。你不能说它真的是从主/细节组装的。那是一种解脱!

但是,我的问题是'overall_score> 70'短语会导致'1722无效数字'错误。当我不包含这个短语时,Oracle和clam一样快乐,所以所有的输出都通过j2的to_number()函数传递,看起来不错。但是,如果我添加条件,我失败了。

where子句的'overall_score'部分是根据从网页输入的搜索条件动态添加的。

我需要一些fu告诉Oracle我真的知道我在做什么,请做。如果有非数字数据,那么让j2的to_number()失败。凉。但是,否则,就这样做。

任何明智的词?我是一名承包商,时间快到了。这是一个新的要求: -/

+1

你看过'j2'返回的是什么,与最终查询分开吗?我发现很难相信你在外部查询中得到了一个无效的数字错误 - 我期望'TO_NUMBER'转换触发错误。 – 2010-09-16 15:37:18

+0

如果我删除'> 70'条件,查询将返回行。当我添加条件时,我得到'1722无效数字'悲伤。 – 2010-09-16 15:41:03

+0

哎呀命中回报而不是换行符。当我单独运行j2子查询时,它会返回无错的有效行。 – 2010-09-16 15:41:42

回答

3

我们创建了一个特殊版本的to_number,它在内部捕获'1722无效数字'异常并返回0而不是。在sql中用这个新函数替换to_number为我们解决了这个问题。

+0

现在我死在水里了。我会尝试它,但我想如果我的SQL是有效的,那么没有crud会通过。 – 2010-09-16 18:24:36

+0

这允许我的查询运行。谢谢。 – 2010-09-16 18:38:37

10

我认为优化器可能会将内联视图与其余查询合并,这意味着条件overall_score > 70可能会针对与其余部分不匹配的行进行评估视图的谓词,从而达到text中不包含数值的行。

如果这就是发生的事情,你应该能够防止它通过在查询的第一行中添加一个提示:

select /*+ NO_MERGE(j2) */ ... 

或者,也可以推谓词到视图,在这种情况下,你需要NO_PUSH_PRED提示。如果您可以为查询生成执行计划,则可能会显示确切的问题。

+0

会做。 DBA正在为我创建一个计划表:-D – 2010-09-16 16:26:43

+0

说明输出太长而无法发布。我使用oracle的UTLXPLS来查看结果。你用什么? – 2010-09-16 16:55:32

+0

我创建了非限定查询的视图。然后,我从总体评分> 70的视图中进行选择。这也失败了。这很奇怪,除非Oracle的优化器足够聪明,可以在选择中优化视图的内部结构。我再次检查了数据,所涉及的列始终是“总体分数”行的数字 - 文本。 – 2010-09-16 17:06:11