第五章 瘋狂Caché 運算符和表達式(三)
字符串連接運算符
字符串運算符(_
)是將其操作數解釋爲字符串並返回字符串值的二進制(兩個操作數)運算符。
可以使用連接來組合字符串文字、數字、表達式和變量。它採用以下形式:
operand_operand
串聯生成的結果是由追加到左操作數的右操作數組成的字符串。它將它們視爲字符串值。
下面的示例連接兩個字符串:
WRITE "High"_"chair"
Highchair
當將一個數字文字連接到另一個數字文字或非數字字符串時,Caché首先將每個數字轉換爲規範形式。
下面的示例連接兩個數字文字:
WRITE 7.00_+008
78
下面的示例連接數字文字和數字字符串:
WRITE ++7.00_"+007"
7+007
下面的示例連接兩個字符串和空字符串:
SET A="ABC"_""_"DEF"
WRITE A
ABCDEF
空字符串對字符串的長度沒有影響。可以將無限數量的空字符串連接到一個字符串。
最大字符串大小是可配置的。如果啓用了長字符串,則最大字符串大小爲3,641,144個字符。否則,最大字符串大小爲32,767個字符。
當連接的字符串太長而無法存儲在變量中時,創建超長字符串的連接可能會導致<store>
錯誤。在發生<store>
錯誤的情況下,通過串聯放大的變量將保留其在串聯之前的值。
連接編碼的字符串
某些Caché 字符串包含內部編碼,可能會限制這些字符串是否可以連接:
-
位字符串 不能與其他位字符串、非位字符串或空字符串(
“”
)連接。嘗試這樣做會導致在訪問結果字符串時出現<Invalid bit string>
錯誤。 -
列表結構字符串 可以與另一個列表結構字符串連接,也可以與空字符串(
“”
)連接。它不能與非列表字符串串聯。嘗試這樣做會在訪問結果字符串時導致<list>
錯誤。 -
JSON字符串 不能與另一個JSON字符串、不是JSON字符串的字符串或空字符串(
“”
)連接在一起。嘗試這樣做會在訪問結果字符串時導致<Invalid OREF>
錯誤。
數值關係運算符
有兩種類型的關係運算符:字符串關係運算符和數值關係運算符。數值關係運算符使用操作數的數值來生成布爾結果。
不應使用數字關係運算符比較非數字字符串。
IEEE雙精度小數($DOUBLE
數)與標準Caché浮點數($DECIMAL
數)之間的比較是精確執行的,無需舍入。$DOUBLE
和$DECIMAL
數字之間的相等比較通常會產生意想不到的結果,應該避免。
小於
小於運算符測試其左操作數是否在數值上小於右操作數。CachéObjectScript對這兩個操作數進行數值計算,並返回布爾結果true(1)
如果左操作數的數值小於其右操作數。如果左操作數的數值等於或大於右操作數,則CachéObjectScript將返回布爾值False(0)
。
例如:
WRITE 9 < 6
0
WRITE 22 < 100
1
大於
大於運算符測試左操作數是否在數值上大於右操作數。CachéObjectScript對這兩個操作數進行數值計算,如果左操作數在數值上大於右操作數,則結果爲true(1)
。如果左操作數在數值上等於或小於右操作數,則生成FALSE(0)
結果。
例如:
WRITE 15 > 15
0
WRITE 22 > 100
0
大於或等於
可以通過以下方式生成大於或等於運算:
- 組合二進制大於(
>
)和等於(=
)運算符。如果兩個運算符之一返回TRUE,則一起使用的兩個運算符返回TRUE。 - 使用二進制小於(
<
)的一元NOT運算符(‘
)。一起使用的兩個運算符將二進制的真值反轉爲小於。
當左操作數在數值上大於或等於右操作數時,CachéObjectScript會生成TRUE(1)
結果。當左操作數在數值上小於右操作數時,它會產生FALSE(0)
結果。可以用以下任何一種方式表示大於或等於運算:
operand_A >= operand_B
operand_A '< operand_B
'(operand_A < operand_B)
小於或等於
可以通過以下方式生成小於或等於運算:
- 組合二元小於(
<
)和等於(=
)運算符。如果兩個運算符之一返回TRUE,則一起使用的兩個運算符返回TRUE。 - 將一元NOT運算符(
‘
)與二進制大於(>
)一起使用。一起使用的兩個運算符反轉二進制大於的真值。
當左操作數在數值上小於或等於右操作數時,CachéObjectScript會生成TRUE(1)
結果。當左操作數在數值上大於右操作數時,它會產生FALSE(0)
結果。
可以用以下任何一種方式表示小於或等於運算:
operand_A <= operand_B
operand_A '> operand_B
'(operand_A > operand_B)
下面的示例在小於或等於運算中測試兩個變量。因爲這兩個變量具有相同的數值,所以結果爲真。
SET A="55",B="55"
WRITE A'>B
1
字符串關係運算符
有兩種類型的關係運算符:數字關係運算符和字符串關係運算符。字符串關係運算符使用操作數的字符串解釋來生成布爾結果。可以在任何字符串關係運算符前面加上NOT邏輯運算符(‘
),以獲得邏輯結果的否定。
等於
等於運算符測試兩個操作數的字符串相等。將二進制等於應用於兩個字符串時,如果兩個操作數是具有相同字符序列且沒有中間字符(包括空格)的相同字符串,則CachéObjectScript返回結果true(1)
;否則返回結果false(0)
。
例如:
WRITE "SEVEN"="SEVEN"
1
二進制等於並不意味着任何操作數的任何數字解釋。例如,即使兩個操作數在數字上相同,下面的語句也會生成值FALSE(0)
:
WRITE "007"="7"
0
如果兩個操作數都有數值,則可以使用制等於運算符來測試數值是否相等。例如:
WRITE 007=7
1
還可以使用一元算術正數強制進行數字轉換。例如:
WRITE +"007"="7"
1
如果這兩個操作數的類型不同,則將兩個操作數轉換爲字符串,並對這些字符串進行比較。
請注意,這可能會因爲四捨五入和轉換爲字符串的有效位數而導致不準確。
例如:
DHC-APP>WRITE "007"=7,!
0
DHC-APP> WRITE 007="7",!
1
DHC-APP> WRITE 17.1=$DOUBLE(17.1),!
0
DHC-APP> WRITE 1.2345678901234567=$DOUBLE(1.2345678901234567),!
0
DHC-APP>w 17.1 = $decimal(17.1)
1
不等於
可以通過將一元NOT運算符與二進制等於一起使用來指定NOT等於運算。可以用兩種方式表示不等於運算:
operand '= operand
'(operand = operand)
不等於反轉應用於兩個操作數的二進制等於運算符的真值。如果兩個操作數不相同,則結果爲TRUE(1)
。如果兩個操作數相同,則結果爲FALSE(0)
。
包含
二進制包含測試右操作數中的字符序列是否爲左操作數的子字符串。如果左操作數包含右操作數表示的字符串,則結果爲TRUE(1)
。如果左操作數不包含右操作數表示的字符串,則結果爲FALSE(0)
。如果右操作數爲空字符串,則結果始終爲真。
下面的示例測試L是否包含S。因爲L確實包含S,所以結果爲TRUE(1)。
SET L="Steam Locomotive",S="Steam"
WRITE L[S
1
下面的示例測試P是否包含S。因爲字符串中的字符序列不同(P中有一個句號,S中有一個感嘆號),所以結果是FALSE(0)。
SET P="Let's play.",S="Let's play!"
WRITE P[S
0
不包含
通過將一元NOT字符與二進制CONTAINS一起使用,可以生成以下任意等效格式的不包含操作:
operand A '[ operand B
'(operand A [ operand B)
如果操作數A不包含由操作數B表示的字符串,則不包含操作返回TRUE,如果操作數A確實包含由操作數B表示的字符串,則返回FALSE。
例如:
SET P="Beatles", S="Mick Jagger"
WRITE P'[S
1
跟隨
跟隨測試左操作數中的字符是否在ASCII排序序列中右操作數中的字符之後。遵循兩個字符串的測試,每個字符串都從最左邊的字符開始。測試在以下任一時間結束:
- 在左操作數中找到與右操作數中相應位置的字符不同的字符。
- 這兩個操作數中都沒有更多的字符可供比較。
如果左操作數中的第一個唯一字符的ASCII值高於右操作數中的對應字符(即,如果左操作數中的字符在ASCII排序順序中右操作數中的字符之後),則CachéObjectScript返回值爲true。如果右操作數比左操作數短,但在其他方面相同,則CachéObjectScript也返回值true。
如果出現以下任一情況,CachéObjectScript將返回值False:
- 左操作數中第一個唯一字符的ASCII值低於右操作數中相應字符的ASCII值。
- 左操作數與右操作數相同。
- 左操作數比右操作數短,但在其他方面相同。
下面的示例測試字符串Lampoon是否按照ASCII排序順序跟在字符串LAMP之後。結果是真的。
WRITE "LAMPOON"]"LAMP"
1
下面的示例測試B中的字符串是否跟在A中的字符串之後,因爲BO在ASCII排序規則序列中跟在BL之後,所以結果爲TRUE。
SET A="BLUE",B="BOY"
WRITE B]A
1
不跟隨
可以使用一元NOT運算符來生成 Not Follows運算,其二進制跟隨的格式爲以下任一等效格式:
operand A ']operand B
'(operand A ] operand B)
如果操作數中的所有字符都相同,或者如果操作數A中的第一個唯一字符的ASCII值低於操作數B中的相應字符,則NOT Follow操作返回結果TRUE。如果操作數A中的第一個唯一字符的ASCII值高於操作數B中的相應字符,則NOT Follow操作將返回FALSE結果。
在下面的示例中,因爲CDE中的C跟在ABC中的A之後,所以結果爲FALSE。
WRITE "CDE"']"ABC",!
WRITE '("CDE"]"ABC")
0
0
排序
在測試左操作數是否在數值下標排序規則序列中右操作數之後排序後進行排序。在數字排序序列中,空字符串首先排序,然後是按數字順序排列的規範數字,首先是負數,然後是零和正數,最後是非數字值。
如果第一個操作數在第二個操作數之後排序,則二進制操作數之後排序運算符返回TRUE(1),如果第一個操作數不在第二個操作數之後排序,則返回FALSE(0)。例如:
WRITE 122]]2
WRITE "LAMPOON"]]"LAMP"
不排序
通過將一元NOT運算符與二進制排序AFTER配合使用,可以生成NOT SORT AFTER操作,其格式爲以下任一等效格式:
operand A ']] operand B
'(operand A ]] operand B)
如果操作對象A與操作對象B相同,或者操作對象B在操作對象A之後排序,則CachéObjectScript返回結果true。如果操作對象A在操作對象B之後排序,則CachéObjectScript將返回False結果。