Oracle 子句中的数字无效

Oracle invalid number in clause

我正在努力使查询正常工作,我真的需要一些帮助。我们有一个内部应用程序,用于在我工作的地方构建小型网络应用程序。它基本上是一个拖放式 GUI。内置了使用键访问查询字符串值的功能。

我通过查询字符串将逗号分隔的值列表传递到页面中。然后,我尝试将值列表用作查询中 in 子句的一部分。

我可以看到查询字符串中的值是正确的。

订单=1,2,3

这是查询的具体部分

"AND OrderNumber IN(这是它从查询字符串映射的位置)

我已经在 Toad 中尝试 运行ning 类似的查询,我想我已经找到了问题所在。它给出了一个无效的数字错误,我认为它将查询字符串值用单引号引起来。当我在 Toad 中执行 "AND OrderNumber IN ('1,2,3')" 时,我可以复制错误。

这是我真正感到困惑的地方。以下适用于 Toad。 "AND OrderNumber IN ('1','2','3')"

所以我试着通过做 select 替换('1,2,3', ',', chr(39)||','||chr(39)) from dual;

我已确认 returns Toad 中的“1”、“2”、“3”。 但是,当我在 Toad 中 运行 以下内容时,我仍然收到无效数字错误。

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

这个问题我绞尽脑汁想不通。在我看来,如果 "AND OrderNumber IN ('1','2','3')" 有效,并且 replace('1,2,3', ',', chr(39)||','||chr(39)) returns ' 1','2','3',"AND OrderNumber IN (replace('1,2,3', ',', chr(39)||','||chr(39))" 应该有效。

如果您能就此提供任何帮助,我们将不胜感激。我知道查询的其余部分有效。这就是我没有 post 的原因。我只是坚持尝试让这个 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,3 转换为单个字符串:1','2','3,并且该单个字符串无法隐式转换为数字。

你能试试下面的查询吗

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 子句应该可以了。

对 phonetic_man 的答案的更改将允许列表中的 NULL 元素。用于解析定界列表的 '[^,]+' 正则表达式格式不处理 NULL 列表元素,如果存在则 return 将是一个不正确的值,因此应避免使用它。例如通过删除数字 2 来更改原始文件并查看结果。您将在第二个元素的位置得到一个“3”!这是处理 NULL 和 return 元素正确值的方法:

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;

有关更多信息和证明,请参阅此处: