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 = "$($month)"【参考方案3】:

感谢吉萨克。只是想分享以下代码,因为这个也可以。

$CAML = "<Where>
             <Eq>
                <FieldRef Name='Period' />
                <Value Type='Text'>$($month)</Value>
             </Eq>
            </Where>"

【讨论】:

在您的情况下,它也可以在没有子表达式运算符 ($()) 的情况下工作。

以上是关于CAML 查询过滤 where 子句的主要内容,如果未能解决你的问题,请参考以下文章

使用 WHERE 子句中的过滤器优化 OUTER JOIN 查询。(查询规划器)

如果 where 子句已经修复,如何加快 spark sql 过滤器查询?

调用视图的查询中的 where 子句是不是会影响视图本身的过滤器?

SQL WHERE 子句类似于 JOIN 查询

`INNER JOIN` 过滤条件在查询中的位置; `ON` 或 `WHERE` 子句 [关闭]

如何在标准 SQL 的 WHERE 子句中使用 WITH 子查询作为选项列表