CAML 查询过滤 where 子句
Posted
技术标签:
【中文标题】CAML 查询过滤 where 子句【英文标题】:CAML query filtering where clause 【发布时间】:2016-05-02 17:33:33 【问题描述】:我在 powershell 中有以下 caml。如果我在 CAML 查询中对 $month 进行硬编码,那么它就可以工作。我使用的语法是否正确?
write-host $month
$CAML = '<Where>
<Eq>
<FieldRef Name="Period" />
<Value Type="Text">$month</Value>
</Eq>
</Where>'
【问题讨论】:
【参考方案1】:在 PowerShell 中,字符串要么是可扩展的(就像 perl 中的可插值字符串),要么是文字。
双引号 ("
) 中的任何内容都是可扩展的,而单引号 ('
) 用于字符串文字,就像您的情况一样。
$month = 'Jan'
"First month is $month" # This will result in: First month is Jan
'First month is $month' # This will result in: First month is $month
对于多行字符串,请使用 here-string(在其他语言中通常称为 here-docs)。同样的规则适用:
$CAML = @"
<Where>
<Eq>
<FieldRef Name="Period" />
<Value Type="Text">$month</Value>
</Eq>
</Where>
"@
如果您想使用字符串文字(即,如果字符串包含其他特殊字符或要保留的文字$
s)但您需要插入特定的变量值,请使用-f
格式运算符as shown by @jisaak:
$CAML = @'
<Where>
<Eq>
<FieldRef Name="Period" />
<Value Type="Text">0</Value>
</Eq>
</Where>
'@ -f $month
要了解有关字符串扩展和引用的更多信息,请参阅Get-Help about_Quoting_Rules
【讨论】:
【参考方案2】:您的变量不会被替换,因为您使用的是单引号。您可以使用双引号或格式字符串(别名 -f
):
write-host $month
$CAML = '<Where>
<Eq>
<FieldRef Name="Period" />
<Value Type="Text">0</Value>
</Eq>
</Where>' -f $month
【讨论】:
感谢您的快速修复。其作品。但是,我只是学习以下代码也可以。 $CAML = "感谢吉萨克。只是想分享以下代码,因为这个也可以。
$CAML = "<Where>
<Eq>
<FieldRef Name='Period' />
<Value Type='Text'>$($month)</Value>
</Eq>
</Where>"
【讨论】:
在您的情况下,它也可以在没有子表达式运算符 ($()
) 的情况下工作。以上是关于CAML 查询过滤 where 子句的主要内容,如果未能解决你的问题,请参考以下文章
使用 WHERE 子句中的过滤器优化 OUTER JOIN 查询。(查询规划器)
如果 where 子句已经修复,如何加快 spark sql 过滤器查询?
调用视图的查询中的 where 子句是不是会影响视图本身的过滤器?