什么是Visual FoxPro的字符串lt(<)/ gt(>)/ lte(< =)/ gte(> =)比较规则?

时间:2016-10-18 01:14:32

标签: visual-foxpro foxpro

  • ?"ABC">"A"返回.F.
  • ?"ABC">"B"返回.F.
  • ?"ABC">"a"返回.T.

这似乎不是ASCII比较(与其他常见的编程语言一样)。

我搜索了MSDN,但是Relational Operators只解释了数字类型或布尔值的比较。 String and Value Comparison未提及lt / gt / lte / gte运算符。

为什么字符串比较会像这样工作?什么是VFP的字符串lt / gt比较的内部规则?

1 个答案:

答案 0 :(得分:4)

实际上VFP的字符串比较与其他语言没什么不同(某些语言-ie:C# - 甚至不允许你使用> =,>,< =和< with字符串)。但是,在VFP中有一个设置会影响字符串比较,它是“设置正确”。除此之外,VFP字符串区分大小写,因此" ABC" > ""为false(alpha排序基于其ASCII字符代码)。

使用默认的SET EXACT OFF,将字符串与右操作数的长度进行比较。即: " ABC" =" A"

比较如下: " A" =" A"

因此它们是平等的,所以" ABC" > " A"是假的(还有#34; ABC"<" A"是假的," ABC" =" A"是真的。)

回顾一下,使用默认的SET EXACT设置,即OFF: " ABC" =" A" (但是" A" =" ABC"是假的 - 比较右操作数的长度。)

AND,字母顺序使用ASCII码。

SET EXACT OFF && Default if not set explicitly
? "ABC" = "A" && .T.
? "ABC" > "A" && .F.
? "ABC" < "B" && .T.

SET EXACT ON
? "ABC" = "A" && .F.
? "ABC" > "A" && .T.
? "ABC" < "B" && .T.

特别说明:如果您在SQL命令中执行此等式检查,则应用ANSI规则并且SET EXACT在那里没有效果。默认情况下,SET ANSI为OFF,&#34; ABC&#34; =&#34; A&#34; (并且由于SQL规则,更改操作数&#39;左侧和右侧不重要,因此&#34; A&#34; =&#34; ABC&#34;也是如此)。即:

Select * from myTable where firstName = "A"

将返回具有firstName&#34; Anthony&#34;,&#34; Alice&#34; ... 等等。

VFP中有一个特殊的==(完全相等)运算符,它与SET EXACT或SET ANSI设置无关。请注意它的行为与常规命令和SQL命令不同。通过常规命令,它实际上意味着完全相同的&#39;包括两个比较字符串中的尾随空格。即:

? 'ABC' == 'ABC ' && false, regardless of SET EXACT

但是使用SQL(无论SET ANSI设置如何):

select * from myTable where myField == 'A'
select * from myTable where myField == 'A '
select * from myTable where myField == 'A  '

都意味着相同并搜索myField内容为A的记录(无论字段大小如何 - 忽略比较两侧的尾随空格)。

注意:我认为您可以请求在堆栈溢出中添加文档主题。 VFP文档刚刚开始,尚未完成任何添加,AFAIK。