You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MarkLogic Optic查询中变量声明列报Column not found错误

MarkLogic Optic查询列变量调用报"列不存在"问题排查

问题现象

将列声明为XQuery变量后在Optic查询中调用,执行后返回Column not found(列不存在)报错,涉及的初始查询代码如下:

xquery version "1.0-ml";
import module namespace op="http://marklogic.com/optic" at "/MarkLogic/optic.xqy";
import module namespace ofn="http://marklogic.com/optic/expression/fn" at "/MarkLogic/optic/optic-fn.xqy";
import module namespace osql="http://marklogic.com/optic/expression/sql" at "/MarkLogic/optic/optic-sql.xqy";  
declare option xdmp:mapping "false";
let $view := op:from-view("GTM2_Shipment", "Shipment_View")
let $count := op:view-col("Shipment_View", "Ancillary_QuotePrice")
return $view
=> op:where(op:and((
                   op:gt(op:col("$count"), 0)

                   ))
                   )
=> op:group-by("transMode", op:count("QuotePrice", "$count"))
=> op:result()

执行后返回报错:

[1.0-ml] SQL-NOCOLUMN: Column not found: $count
Stack Trace
At line 1 column 2:
In sem:execute(plan:sparql(" * { sample(transMode) AS transMode) count($count) AS QuotePrice) { FILTER ($count gt xs:integer("0") and fn:format-dateTime(xs:dateTime(BookingCreateDt), xs:string("[Y0001]-[M01]-[D01]")) gt sql:dateadd(xs:string("month"), xs:int("-6"), fn:format-dateTime(xs:dateTime("2022-06-30T10:42:50.2654743+01:00"), xs:string("[Y0001]-[M01]-[D01]")))) } GROUP BY transMode }"), (), ()

尝试将列声明改为let $count := op:col("Ancillary_QuotePrice")后,依旧返回相同报错。

问题根因

代码错误地将XQuery变量名的字符串形式"$count"传入了Optic函数,同时错误地给已经是列引用对象的变量额外包裹了op:col():

  • op:col()、op:view-col()的返回值本身就是Optic可直接识别的列访问表达式对象,赋值给XQuery变量后可以直接作为参数传入其他Optic函数
  • 传入字符串"$count"时,Optic会去视图中查找字面名称为$count的列,而非预先定义的Ancillary_QuotePrice列,自然触发列不存在报错

修复方案

去掉多余的op:col()包裹,直接将存储列引用的XQuery变量传入对应函数参数即可,修复后的代码如下:

xquery version "1.0-ml";
import module namespace op="http://marklogic.com/optic" at "/MarkLogic/optic.xqy";
import module namespace ofn="http://marklogic.com/optic/expression/fn" at "/MarkLogic/optic/optic-fn.xqy";
import module namespace osql="http://marklogic.com/optic/expression/sql" at "/MarkLogic/optic/optic-sql.xqy";  
declare option xdmp:mapping "false";
let $view := op:from-view("GTM2_Shipment", "Shipment_View")
let $count := op:view-col("Shipment_View", "Ancillary_QuotePrice")
return $view
=> op:where(op:and((
                   op:gt($count, 0)
                   ))
                   )
=> op:group-by("transMode", op:count("QuotePrice", $count))
=> op:result()

注意事项

  • 仅当直接通过列名字符串引用列时,才需要用op:col("列名")的形式包裹字符串
  • 如果已经把列引用对象赋值给XQuery变量,直接传变量即可,不要传带$前缀的变量名字符串,也不要重复包裹op:col()

内容的提问来源于stack exchange,提问作者Rashmita Purkayastha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:27:47