首页 > 解决方案 > 如何在 MarkLogic javascript 中实现 SQL 查询?

问题描述

我有一个SQLJavascript在 MarkLogic 中以查询类型实现的查询。目标是返回所有URIs的查询结果。

下面是我要转换的 SQL 查询:

SELECT * FROM DOCUMENT_TABLE
WHERE WADCTO IN ('WM', 'WO')
AND (WASRST NOT IN ('02', 'M', 'M9')) AND (WASTRX = 0)

这是我在查询控制台中测试的当前 Javascript 查询,但返回的行数与 SQL 查询不同:

cts.uris(null, null, 
  cts.andQuery([
    cts.collectionQuery("JDEdwards"), 
    cts.collectionQuery("WorkOrder_Document"),
    cts.andQuery([
      cts.orQuery([
        cts.elementRangeQuery(fn.QName("http://www.example.com/ads/JDEdwards/document", "WADCTO"),"=","WO"),
        cts.elementRangeQuery(fn.QName("http://www.example.com/ads/JDEdwards/document", "WADCTO"),"=","WM")
      ]),
      cts.andQuery([
        cts.elementRangeQuery(fn.QName("http://www.example.com/ads/JDEdwards/document", "WASRST"),"!=","02"),
        cts.elementRangeQuery(fn.QName("http://www.example.com/ads/JDEdwards/document", "WASRST"),"!=","M"),
        cts.elementRangeQuery(fn.QName("http://www.example.com/ads/JDEdwards/document", "WASRST"),"!=","09")
      ]),
      cts.elementRangeQuery(fn.QName("http://www.example.com/ads/JDEdwards/document", "WASTRX"),"=","0")
    ])
  ])
);

请注意,我为元素设置了范围索引WADCTOWASRSTWASTRX

我的代码逻辑有什么遗漏或错误吗?

标签: marklogicmarklogic-8marklogic-9

解决方案


范围查询可以指定与 OR 相关的值列表。此外,cts.notQuery()可以否定查询。可能类似于以下草图的东西可能会更接近。

cts.uris(null, null, 
  cts.andQuery([
    cts.collectionQuery("JDEdwards"),
    cts.collectionQuery("WorkOrder_Document"),
    cts.elementRangeQuery(fn.QName("...", "WADCTO"),"=", ["WO", "WM"]),
    cts.notQuery(
      cts.elementRangeQuery(fn.QName("...", "WASRST"),"=", ["02", "M", "09"])
      ),
    cts.elementRangeQuery(fn.QName("...", "WASTRX"),"=", "0")
    ]);

要检查的事情包括

  • 目标文档是否在两个集合中
  • 命名空间对于元素是否正确
  • 范围索引是否具有字符串数据类型(WASTRX 在 SQL 版本的查询中是一个数字)

如果一切都失败了,请尝试删除查询子句,直到查询可以找到有问题的查询子句。

希望有帮助,


推荐阅读