Что такое правило сравнения строк lt() /lte(=) в Visual FoxPro?

#visual-foxpro #foxpro

#visual-foxpro #foxpro

Вопрос:

  • ?"ABC">"A" ВОЗВРАТ .F.
  • ?"ABC">"B" ВОЗВРАТ .F.
  • ?"ABC">"a" ВОЗВРАТ .T.

Похоже, это не сравнение ASCII (как в других распространенных языках программирования).

Я искал MSDN, однако реляционные операторы объясняли сравнение только по числовому типу или логическому. Сравнение строк и значений не упоминало операторов lt / gt / lte / gte.

Почему сравнение строк работает именно так? Каковы внутренние правила VFP для сравнения строк lt / gt?

Ответ №1:

На самом деле сравнение строк VFP не сильно отличается от сравнения на других языках (некоторые языки, например: C #, даже не позволяют использовать >=, >, <= и < со строками). Однако в VFP есть один параметр, который влияет на сравнение строк, и он «УСТАНОВЛЕН ТОЧНО». Кроме этого, строки VFP чувствительны к регистру, поэтому «ABC»> «a» равно false (альфа-сортировка основана на их кодах символов ASCII).

При ВЫКЛЮЧЕННОМ значении ПО умолчанию строки сравниваются с точностью до длины правого операнда. т.е.: «ABC» = «A»

сравнивается следующим образом: «A» = «A»

таким образом, они равны, поэтому «ABC»> «A» равно false (а также «ABC» < «A» равно false, «ABC» = «A» равно true).

Напомним, что по умолчанию УСТАНОВЛЕНА ТОЧНАЯ настройка, которая ОТКЛЮЧЕНА: «ABC» = «A» (но «A» = «ABC» равно false — сравните с длиной правого операнда).

И в алфавитном порядке используется код ASCII.

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

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

Особое примечание: если вы выполняете эту проверку равенства в командах SQL, то там применяются правила ANSI, и SET EXACT не имеет никакого эффекта. По умолчанию значение ANSI отключено, а «ABC» = «A» (и из-за правил SQL изменение левой и правой сторон операндов не имеет значения, поэтому «A» = «ABC» также верно). ie:

 Select * from myTable where firstName = "A"
  

будут возвращены записи с именем «Энтони», «Алиса»… и так далее.

В VFP есть специальный оператор == (точно равный), который работает независимо от ЗАДАННЫХ ТОЧНЫХ или заданных настроек ANSI. Будьте осторожны, его поведение отличается от обычных команд и команд SQL. С обычными командами это действительно означает «точно равно», включая конечные пробелы в обеих сравниваемых строках. ie:

 ? 'ABC' == 'ABC ' amp;amp; false, regardless of SET EXACT
  

Однако с SQL (независимо от установленного параметра ANSI):

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

все они означают одно и то же и выполняют поиск записей, содержимое MyField которых равно A (независимо от размера поля — конечные пробелы с обеих сторон сравнения игнорируются).

Примечание: я думаю, вы можете запросить добавление разделов документа в stack overflow. Документация по VFP только началась, и никаких дополнений еще не сделано, AFAIK.

Комментарии:

1. Я обнаружил, что независимо от того, включен или выключен параметр SET EXACT, ?"ABC">"a" всегда верно.

2. @Jamesits, я думаю, у вас опечатка. ? «ABC» > «a» всегда равно false, независимо от заданной точности.