我努力让查询工作,我真的可以使用一些帮助。我们有一个内部应用程序,用于构建我工作的小型Web应用程序。它基本上是一个拖放GUI。内置了使用密钥访问查询字符串值的功能。
我通过查询字符串将逗号分隔的值列表传递到页面中。然后我尝试将值列表用作查询中的in子句的一部分。
我可以看到查询字符串中的值是正确的。
订单= 1,2,3
这是查询的具体部分
" AND OrderNumber IN(这是从查询字符串映射的地方)
我尝试在Toad中运行类似的查询,我想我已经发现了这个问题。它给出了无效的数字错误,我认为它将查询字符串值包装在单引号中。当我做" AND OrderNumber IN(' 1,2,3')"我可以复制错误。在Toad。
这里我真的很困惑。以下适用于Toad。 " AND OrderNumber IN(' 1',' 2',' 3')"
所以我尝试通过这样做重新创建 从双重选择替换(' 1,2,3',',',chr(39)||',' || chr(39)) ;
我已确认退货' 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&#39) ;,',',chr(39)||',' || chr(39))"应该有效。
您可以提供的任何帮助都将非常感谢。我知道查询的其余部分有效。这就是我没有发布的原因。我只是试着让这个IN子句工作。
答案 0 :(得分:2)
更改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
答案 1 :(得分:1)
您可以尝试以下查询。
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
内联查询将字符串拆分为不同的行。因此,在执行它时,您将得到以下结果。
{{1}}
现在,将此结果传递给主查询IN子句应该可以正常工作。
答案 2 :(得分:0)
我认为要构建的期望条款是:
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
,并且不能将此单个字符串隐式转换为数字。