条款

时间:2016-06-23 02:58:57

标签: oracle where toad

我努力让查询工作,我真的可以使用一些帮助。我们有一个内部应用程序,用于构建我工作的小型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子句工作。

3 个答案:

答案 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,并且不能将此单个字符串隐式转换为数字。