簡體   English   中英

Oracle子句中的無效數字

[英]Oracle invalid number in clause

我正在努力讓查詢工作,我真的可以使用一些幫助。 我們有一個內部應用程序,用於構建我工作的小型Web應用程序。 它基本上是一個拖放GUI。 內置了使用密鑰訪問查詢字符串值的功能。

我通過查詢字符串將逗號分隔的值列表傳遞到頁面中。 然后我嘗試使用值列表作為查詢中的in子句的一部分。

我可以看到查詢字符串中的值是正確的。

訂單= 1,2,3

這是查詢的特定部分

“AND OrderNumber IN(這是從查詢字符串映射的位置)

我試過在Toad中運行類似的查詢,我想我已經找到了問題。 它給出了無效的數字錯誤,我認為它將查詢字符串值包裝在單引號中。 當我在Toad中執行“AND OrderNumber IN('1,2,3')”時,我可以復制錯誤。

這是我真的很困惑的地方。 以下適用於Toad。 “AND OrderNumber IN('1','2','3')”

所以我嘗試通過從雙重選擇替換('1,2,3',',',chr(39)||','|| chr(39))重新創建它;

我已確認在Toad中返回'1','2','3'。 但是,當我在Toad中運行以下內容時,仍然會收到無效數字錯誤。

AND OrderNumber IN(替換('1,2,3',',',chr(39)||','|| chr(39))

我一直在絞盡腦汁,我無法弄明白。 在我看來,如果“AND OrderNumber IN('1','2','3')”工作,並替換('1,2,3',',',chr(39)||',' || chr(39))返回'1','2','3',表示“AND OrderNumber IN(替換('1,2,3',',',chr(39)||','| | chr(39))“應該工作。

您可以提供的任何幫助將非常感謝。 我知道查詢的其余部分有效。 這就是為什么我沒有發布它。 我只是試着讓這個IN子句工作。

更改為phonetic_man的答案,允許列表中的NULL元素。 用於解析分隔列表的'[^,]+'的正則表達式格式不處理NULL列表元素,如果存在,則返回不正確的值,因此應避免使用它。 例如,通過刪除數字2來更改原始內容並查看結果。 你將在第二個元素的位置獲得一個'3'! 這是一種處理NULL並返回元素的正確值的方法:

SELECT TRIM(REGEXP_SUBSTR(str, '(.*?)(,|$)', 1, LEVEL, NULL, 1)) str
    FROM ( SELECT '1,,3,4' str FROM dual )
    connect by level <= regexp_count(str, ',') + 1;

有關詳細信息和證明,請參閱此處: https//stackoverflow.com/a/31464699/2543416

你可以嘗試以下查詢。

SELECT * FROM orders
WHERE orderno IN    
    (
    SELECT TRIM(REGEXP_SUBSTR(str, '[^,]+', 1, LEVEL)) str
    FROM ( SELECT '1,2,3,4' str FROM dual )
    CONNECT BY INSTR(str, ',', 1, LEVEL - 1) > 0
    )

內聯查詢將字符串拆分為不同的行。 因此,在執行它時,您將獲得以下結果。

SELECT trim(regexp_substr(str, '[^,]+', 1, LEVEL)) str
    FROM ( SELECT '1,2,3,4' str FROM dual )
    CONNECT BY instr(str, ',', 1, LEVEL - 1) > 0

1
2
3
4

現在,將此結果傳遞給主查詢IN子句應該可行。

我認為要構建的期望條款是:

AND OrderNumber IN (1,2,3)

數字列表。 您測試的示例:

AND OrderNumber IN ('1','2','3')

之所以有效,是因為列表中的每個元素都發生了從VARCHAR2到NUMBER的隱式轉換。

以下子句不起作用,因為不能對字符串'1,2,3'進行隱式轉換(注意該子句有一個字符串元素):

AND OrderNumber IN ('1,2,3')

在進行替換時,您將使用單個字符串轉換單個字符串: 1,2,31','2','3並且此單個字符串不能隱式轉換為數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM