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;
有关更多信息和证明,请参阅此处:
我正在努力使查询正常工作,我真的需要一些帮助。我们有一个内部应用程序,用于在我工作的地方构建小型网络应用程序。它基本上是一个拖放式 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;
有关更多信息和证明,请参阅此处: