2010-09-16 70 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