表示式

表示式指定值。 它可以是簡式值 (只包含常數或直欄名稱) ,也可以更複雜。 如果您重複使用類似的複式表示式,請考量使用 SQL 函數來封裝一般表示式。

授權

使用部分表示式 (例如純量次選取、序列參照或函數呼叫) 可能需要特殊授權。 對於這些表示式,陳述式的授權 ID 所保留的專用權必須包括下列授權:
純量次選取
如需授權考量的相關資訊,請參閱 SQL 查詢
序列參照
參照順序的授權。 如需授權考量的相關資訊,請參閱 順序授權
函數呼叫
執行使用者定義函數的授權。 如需授權考量的相關資訊,請參閱 函數中的 函數呼叫 一節。
變數
如果變數是廣域變數,則需要授權來參照廣域變數。 如需相關資訊,請參閱 廣域變數

在 Unicode 資料庫中,接受字元或圖形字串的表示式將接受任何支援轉換的字串類型。

expression
Read syntax diagramSkip visual syntax diagramoperator ~  +  - function-invocation1(expression)constant2column-namevariable3special-register4scalar-fullselect5labeled-duration6case-expression7cast-specification8field-reference9xmlcast-specification10array-element-specification11array-constructor12dereference-operation13method-invocation14OLAP-specification15row-change-expression16sequence-reference17subtype-treatment18search-condition19
operator
Read syntax diagramSkip visual syntax diagram **  *  /  %  CONCAT  || 20 +  -  &  |  ^
Notes:

不含運算子的表示式

如果未使用任何運算子,則表示式的結果會是指定的值。 例如:

   SALARY:SALARY'SALARY'MAX(SALARY)

具有連結運算子的表示式

連結運算子 (CONCAT 或 | |) 結合兩個運算元,以形成 字串表示式

第一個運算元是傳回任何字串資料類型、任何數值資料類型或任何日期時間資料類型的值的表示式。 第二個運算元也是傳回任何字串資料類型、任何數值資料類型或任何日期時間資料類型的值的表示式。 不過,部分資料類型不支援與第一個運算元的資料類型一起使用,如本節其餘部分中所述。

每一個運算元都可以是下列任何類型:
  • 字串 (二進位字串除外)
  • 數值 (這會隱含地強制轉型為 VARCHAR)
  • Datetime (這隱含地強制轉型為 VARCHAR)
  • 布林 (這會隱含地強制轉型為 VARCHAR)
不過,二進位字串只能與另一個二進位字串或定義為 FOR BIT DATA 的字串連結。

只有在 Unicode 資料庫中才支援同時包含字串運算元和圖形字串運算元的連結。 在連接之前,字元運算元會先轉換成圖形資料類型。 定義為 FOR BIT DATA 的字串無法強制轉型為圖形資料類型。

如果任一運算元可以是空值,則結果可以是空值,如果任一運算元是空值,則結果是空值。 否則,結果會由第一個運算元字串後面接著第二個運算元字串所組成。 請注意,在執行連結時,不會檢查格式不正確的混合資料。

結果的長度是運算元長度的總和。 在 Unicode 資料庫中,結果的字串單位是運算元的最大字串單位,如 結果資料類型的規則中所述。

除非使用 CODEUNITS32: 定義運算元,否則結果的資料類型及長度屬性是由下列表格中所示運算元的資料類型及長度屬性所決定:

表 1. 不含 CODEUNITS32 之連結運算元的資料類型及長度
運算元 結合長度屬性1 結果
CHAR (A) CHAR (B) <256 CHAR (A + B)
CHAR (A) CHAR (B) >255 VARCHAR (A + B)
CHAR (A) VARCHAR (B) <4001 VARCHAR (A + B)
CHAR (A) VARCHAR (B) >4000 LONG VARCHAR
CHAR (A) LONG VARCHAR - LONG VARCHAR
VARCHAR (A) VARCHAR (B) <4001 VARCHAR (A + B)
VARCHAR (A) VARCHAR (B) >4000 LONG VARCHAR
VARCHAR (A) LONG VARCHAR - LONG VARCHAR
LONG VARCHAR LONG VARCHAR - LONG VARCHAR
CLOB (A) CHAR (B) - CLOB (MIN (A + B , 2147483647))
CLOB (A) VARCHAR (B) - CLOB (MIN (A + B , 2147483647))
CLOB (A) LONG VARCHAR - CLOB (MIN (A+32700, 2147483647))
CLOB (A) CLOB (B) - CLOB (MIN (A + B , 2147483647))
GRAPHIC (A) GRAPHIC (B) <128 GRAPHIC (A + B)
GRAPHIC (A) GRAPHIC (B) >127 VARGRAPHIC (A + B)
GRAPHIC (A) VARGRAPHIC (B) <2001 VARGRAPHIC (A + B)
GRAPHIC (A) VARGRAPHIC (B) >2000 LONG VARGRAPHIC
GRAPHIC (A) LONG VARGRAPHIC - LONG VARGRAPHIC
VARGRAPHIC (A) VARGRAPHIC (B) <2001 VARGRAPHIC (A + B)
VARGRAPHIC (A) VARGRAPHIC (B) >2000 LONG VARGRAPHIC
VARGRAPHIC (A) LONG VARGRAPHIC - LONG VARGRAPHIC
Long VARGRAPHIC LONG VARGRAPHIC - LONG VARGRAPHIC
DBCLOB (A) GRAPHIC (B) - DBCLOB (MIN (A + B , 1073741823))
DBCLOB (A) VARGRAPHIC (B) - DBCLOB (MIN (A + B , 1073741823))
DBCLOB (A) LONG VARGRAPHIC - DBCLOB (MIN (A+16350, 1073741823))
DBCLOB (A) DBCLOB (B) - DBCLOB (MIN (A + B , 1073741823))
BINARY (A) BINARY (B) <256 BINARY (A + B)
BINARY (A) CHAR (B) FOR BIT DATA <256 BINARY (A + B)
BINARY (A) BINARY (B) >255 VARBINARY (A + B)
BINARY (A) CHAR (B) FOR BIT DATA >255 VARBINARY (A + B)
BINARY (A) VARBINARY (B) - VARBINARY (MIN (A + B , 32672))
BINARY (A) VARCHAR (B) FOR BIT DATA - VARBINARY (MIN (A + B , 32672))
VARBINARY (A) VARBINARY (B) - VARBINARY (MIN (A + B , 32672))
VARBINARY (A) CHAR (B) FOR BIT DATA - VARBINARY (MIN (A + B , 32672))
VARBINARY (A) VARCHAR (B) FOR BIT DATA - VARBINARY (MIN (A + B , 32672))
BLOB (A) BINARY (B) - BLOB (MIN (A + B , 2147483647))
BLOB (A) CHAR (B) FOR BIT DATA - BLOB (MIN (A + B , 2147483647))
BLOB (A) VARBINARY (B) - BLOB (MIN (A + B , 2147483647))
BLOB (A) VARCHAR (B) FOR BIT DATA - BLOB (MIN (A + B , 2147483647))
BLOB (A) BLOB (B) - BLOB (MIN (A + B , 2147483647))
注意事項

1 指定給「結合長度屬性」的數字會在 OCTETS 中列出字串,並在 CODEUNITS16 中列出圖形字串。 如果使用 CODEUNITS32定義運算元,請參閱下一個表格。

如果使用 CODEUNITS32定義運算元,則其他運算元無法定義為 FOR BIT DATA。 否則,當使用 CODEUNITS32定義運算元時,會根據下表中所示運算元的資料類型及長度屬性來判定結果的資料類型及長度屬性:

表 2. CODEUNITS32 的連結運算元的資料類型和長度
運算元 結合長度屬性 結果
CHAR (A) CHAR (B) <64 CHAR (A + B)
CHAR (A) CHAR (B) >63 VARCHAR (A + B)
CHAR (A) VARCHAR (B) - VARCHAR (MIN (A + B , 8168))
VARCHAR (A) VARCHAR (B) - VARCHAR (MIN (A + B , 8168))
CLOB (A) CHAR (B) - CLOB (MIN (A + B , 536870911))
CLOB (A) VARCHAR (B) - CLOB (MIN (A + B , 536870911))
CLOB (A) CLOB (B) - CLOB (MIN (A + B , 536870911))
GRAPHIC (A) GRAPHIC (B) <64 GRAPHIC (A + B)
GRAPHIC (A) GRAPHIC (B) >63 VARGRAPHIC (A + B)
GRAPHIC (A) VARGRAPHIC (B) - VARGRAPHIC (MIN (A + B , 8168))
VARGRAPHIC (A) VARGRAPHIC (B) - VARGRAPHIC (MIN (A + B , 8168))
DBCLOB (A) CHAR (B) - DBCLOB (MIN (A + B , 536870911))
DBCLOB (A) VARCHAR (B) - DBCLOB (MIN (A + B , 536870911))
DBCLOB (A) DBCLOB (B) - DBCLOB (MIN (A + B , 536870911))

為了與舊版或其他資料庫產品相容,不會將涉及 LONG VARCHAR 或 LONG VARGRAPHIC 資料類型的結果自動呈報至 LOB 資料類型。 例如, CHAR (200) 值與完全完整 LONG VARCHAR 值的連結會導致錯誤,而不是提升至 CLOB 資料類型。

結果的字碼頁被視為衍生的字碼頁,由其運算元的字碼頁決定。 如需相關資訊,請參閱 字串轉換的規則

一個運算元可以是參數標記。 如果使用參數標記,則該運算元的資料類型及長度屬性會被視為與非參數標記運算元的資料類型及長度屬性相同。 在具有巢狀連結的情況下,必須考量作業順序來決定這些屬性。

範例 1: 如果 FIRSTNME 是 Pierre 且 LASTNAME 是 Fermat ,則下列各項:
   FIRSTNME CONCAT ' ' CONCAT LASTNAME
會傳回值 Pierre Fermat
範例 2: 給定:
  • 直欄 COLA 定義為 VARCHAR (5) ,且值 'AA' 已插入其中。
  • 字元主變數 :host_var 以長度 5 及值 'BB   '定義。
  • 直欄 COLC 定義為 CHAR (5) ,且值 'CC' 已插入其中。
  • 直欄 COLD 定義為 CHAR (5) ,且值 'DDDDD' 已插入其中。
COLA CONCAT :host_var CONCAT COLC CONCAT COLD 的值為 'AABB   CC   DDDDD'

結果的資料類型是 VARCHAR ,且其長度屬性是 2 + 5 + 5 + 5 = 17。 結果字碼頁是 區段 字碼頁。 如需區段字碼頁的相關資訊,請參閱 衍生字碼頁值

範例 3: 給定:
  • COLA 定義為 CHAR (10)
  • COLB 定義為 VARCHAR (5)
表示式中的參數標記:
   COLA CONCAT COLB CONCAT ?
視為 VARCHAR (15) ,因為會先評估 COLA CONCAT COLB ,並提供結果給第二個 CONCAT 作業的第一個運算元。

使用者定義類型和連結運算子

弱類型化特殊類型是唯一可以與連結運算子搭配使用的使用者定義類型。 當處理連結運算子時,弱類型化特殊類型的來源類型會用作運算元的資料類型。

高度類型化使用者定義類型無法與連結運算子一起使用,即使它是高度類型化特殊類型,且來源資料類型是字串類型也一樣。 若要連結,請建立以 CONCAT 運算子作為其來源的函數。 例如,如果有特殊類型 TITLE 及 TITLE_XX_ENCODE_CASE_ONE description ,兩者都有 VARCHAR (25) 資料類型,則可以使用下列使用者定義函數 ATTACH 來連結它們。
   CREATE FUNCTION ATTACH (TITLE, TITLE_DESCRIPTION)
     RETURNS VARCHAR(50) SOURCE CONCAT (VARCHAR(), VARCHAR())
或者,可以使用使用者定義的函數來新增資料類型,使連結運算子超載。
   CREATE FUNCTION CONCAT (TITLE, TITLE_DESCRIPTION)
     RETURNS VARCHAR(50) SOURCE CONCAT (VARCHAR(), VARCHAR())

具有算術運算子的表示式

如果表示式使用算術運算子,則表示式的結果是從運算子套用至運算元值所衍生的值。 可以使用 infix 或字首表示法來指定這些運算子。 例如,陳述式 a+b"+"(a,b) 是相等的。

如果算術表示式中有任何運算元可以是空值,或如果資料庫配置的 dft_sqlmathwarn 設為 yes,則結果可以是空值。 如果算術表示式中有任何運算元具有空值,則表示式的結果是空值。

算術運算子可以套用至帶正負號的數值類型及日期時間類型 (請參閱 SQL 中的日期時間算術)。 例如, USER+2 無效。 當算術運算的任何運算元是弱類型化特殊類型時,會執行該作業,並假設該運算元的資料類型是弱類型化特殊類型的來源類型。 針對 高度類型化 特殊類型 (來源類型為帶正負號的數值類型) 上的算術運算,可以定義有源函數。

單元加號 (+) 字首運算子不會變更其運算元。 unary-(-) 字首運算子會反轉下列的符號:
  • 非零非十進位浮點運算元
  • 十進位浮點運算元,包括 0、-0、quiet NaNs、信號 NaNs、+ infinity 及 -infinity
如果值 x 的資料類型是小整數,則 -x 的資料類型是大整數。 記號在字首運算子之後的第一個字元不能是加號 (+) 或減號 (-)。
表 3. 二進位算術運算子
算術運算子 NAME 說明
+ 加法 結果是第一個和第二個引數的總和。
- 減法 結果是第一個引數減去第二個引數。
* 乘法 結果是第一個引數乘以第二個引數。
/ 除法 結果是第一個引數除以第二個引數。 除非使用十進位浮點算術來執行計算,否則第二個運算元的值可能不是零。
% 模數 結果是第一個引數的餘數除以第二個引數。
** 指數(X) 結果是第一個引數加至第二個引數的次方。 結果的資料類型為:
  • INTEGER (如果兩個引數都是 INTEGER 或 SMALLINT 類型)
  • 如果一個引數屬於 BIGINT 類型,而另一個引數屬於 BIGINT、INTEGER 或 SMALLINT 類型,則為 BIGINT
  • 如果其中一個或兩個引數的類型為 DECFLOAT ,則為 DECFLOAT (34) ,除非下列其中一個陳述式為 true ,在此情況下,結果為類型 NAN 且發出無效的作業條件:
    • 兩個引數都是零。
    • 第二個引數具有非零小數部分。
    • 第二個引數超過 9 位數。
    • 第二個引數是 INFINITY。
  • DOUBLE 否則

在執行算術運算之前,使用 CAST 規格的規則將非 LOB 字串的運算元轉換為 DECFLOAT (34)。 如需相關資訊,請參閱 在資料類型之間強制轉型。 涉及圖形字串運算元的算術運算只能針對 Unicode 資料庫執行。

算術錯誤

如果在處理非十進位浮點表示式期間發生算術錯誤 (例如除以零或數值溢位) ,則會傳回錯誤 (SQLSTATE 22003 或 22012)。 對於小數浮點表示式,會傳回警告 (SQLSTATE 0168C、 0168D、 0168E或 0168F,視算術條件的本質而定)。

資料庫可以配置 (使用 dft_sqlmathwarn 設為 YES) ,以便算術錯誤會針對非十進位浮點表示式傳回空值,查詢會傳回警告 (SQLSTATE 01519 或 01564) ,並繼續處理 SQL 陳述式。

對於十進位浮點表示式, dft_sqlmathwarn 設定無效; 算術條件會傳回適當的值 (可能是十進位浮點特殊值) ,查詢會傳回警告 (SQLSTATE 0168C、 0168D、 0168E或 0168F) ,並繼續處理 SQL 陳述式。 傳回的特殊值包括加號及負無限大,而不是數字。 包含一個以上十進位浮點數字的算術表示式絕不會評估為空值,除非表示式的一個以上引數是空值。

將算術錯誤視為空值時,會對 SQL 陳述式的結果產生含意。 以下是這些含意的一些範例。

  • 在作為聚集函數的引數的表示式中發生算術錯誤,會導致在判定聚集函數的結果時忽略該列。 如果算術錯誤是溢位,這可能會顯著影響結果值。
  • 在 WHERE 子句中述詞的表示式中發生算術錯誤,可能會導致結果中不包含列。
  • 在檢查限制中述詞的表示式中發生算術錯誤會導致更新或插入繼續進行,因為限制不是 false。
如果無法接受這些類型的影響,則應該採取其他步驟來處理算術錯誤,以產生可接受的結果。 範例:
  • 新增 case 表示式以檢查除零並設定這類狀況的必要值
  • 新增其他述詞以處理空值 (例如不可為空值的直欄上的檢查限制可能會變成:
       check (c1*c2 is not null and c1*c2>5000)
    會導致在溢位上違反限制)。

兩個整數運算元

如果算術運算子的兩個運算元都是整數,則會以二進位執行作業,且結果是 large integer ,除非其中一個 (或兩個) 運算元是大整數,在此情況下,結果是大整數。 任何剩餘的除法都將遺失。 整數算術運算 (包括以單元減號運算子表示的否定) 的結果必須在結果類型的範圍內。

整數和小數運算元

如果一個運算元是整數,而另一個運算元是小數,則會使用已轉換為小數數字且精準度為 p 且小數位數為 0 的整數暫時副本,以小數執行作業; p 是 19 表示大整數, 11 表示大整數,而 5 表示小整數。

兩個十進位運算元

如果兩個運算元都是十進位,則會以十進位來執行作業。 任何十進位算術運算的結果都是具有精準度和小數位數的十進位數,這些精準度和小數位數取決於運算以及運算元的精準度和小數位數。 如果作業是加法或減法,且運算元沒有相同的小數位數,則會使用其中一個運算元的暫時副本來執行作業。 較短運算元的副本以尾端零延伸,因此其小數部分具有與較長運算元相同的位數。

十進位作業的結果不能具有大於 31 的精準度。 小數加法、減法和乘法的結果是從可能具有大於 31 的精準度的暫時結果衍生而來。 如果暫時結果的精準度不大於 31 ,則最終結果與暫時結果相同。

SQL 中的十進位算術

使用這裡顯示的公式來計算 SQL 中十進位作業結果的精準度和小數位數。 公式使用下列符號:
p
第一個運算元的精準度。
s
第一個運算元的小數位數。
p'
第二個運算元的精準度。
s'
第二個運算元的小數位數。
加法和減法
結果的尺度為 MAX(s,s')。 如果 DEC15 模式有效且 p<15p'<15,則精準度為 MIN(15,MAX(p-s,p'-s')+MAX(s,s')+1)。 否則,精準度為 MIN(31,MAX(p-s,p'-s')+MAX(s,s')+1)
乘法
如果 DEC15 模式有效且 p<15p'<15,則精準度為 MIN(15,p+p') ,小數位數為 MIN(15,s+s')。 否則,精準度為 MIN(31,p+p') ,而小數位數為 MIN(31,s+s')
除法
下表根據各種因素顯示結果精準度和小數位數。
表 4. 十進位除法的結果精準度及小數位數
DECIMAL 算術模式1 p p ' 結果精準度 結果比例
預設值 n/a n/a 31 31-p+s-s'
DEC15 <=15 <=15 15 日 15-(p-s+s')
DEC15 >15 <=15 31 N-(p-s+s'),其中:
  • N30-p' if p' 是奇數
  • N29-p' if p' 是偶數
DEC31 n/a <=15 31 N-(p-s+s'),其中:
  • N30-p' if p' 是奇數
  • N29-p' if p' 是偶數
DEC15 或 DEC31 n/a >15 31 15-(p-s+MAX(0,s'-(p'-15)))
附註:
  1. 這些模式由 dec_arithmetic 配置參數決定。

如果最小 DECIMAL 除法小數位數 S 有效,則小數位數是 S 的最小值,以及衍生自 表 4的小數位數。 否則,負比例會導致錯誤 (SQLSTATE 42911)。

指數(X)
結果類型為 DOUBLE。

浮點運算元

如果算術運算子的任一運算元是浮點,但不是十進位浮點,則會在浮點中執行作業。 必要的話,會先將運算元轉換成倍精準度浮點數字。 因此,如果表示式的任何元素是浮點數字,則表示式的結果是倍精準度浮點數字。

使用已轉換為倍精準度浮點數的整數暫時副本來執行包含浮點數字和整數的作業。 使用已轉換為倍精準度浮點數的十進位數暫時副本來執行包含浮點數和十進位數的作業。 浮點作業的結果必須在浮點數字的範圍內。

浮點運算元 (或函數的引數) 的處理順序可能會稍微影響結果,因為浮點運算元是實數的近似表示法。 因為最佳化程式可能會隱含地修改運算元的處理順序 (例如,最佳化程式可能會決定要使用的平行化程度及要使用的存取計劃) ,所以使用浮點運算元的應用程式不應該根據每次執行 SQL 陳述式時完全相同的結果。

十進位浮點運算元

如果算術運算子的任一運算元是十進位浮點,則會以十進位浮點執行作業。
整數和小數浮點運算元
如果一個運算元是小整數或大整數,而另一個運算元是 DECFLOAT (n) 數字,則會使用已轉換為 DECFLOAT (n) 數字的整數暫時副本,在 DECFLOAT (n) 中執行作業。 如果一個運算元是大整數,而另一個運算元是十進位浮點數字,則大整數的暫時副本會轉換為 a DECFLOAT (34) number。 然後套用 2-decimal 浮點運算元的規則。
十進位及十進位浮點運算元
如果一個運算元是十進位,而另一個運算元是十進位浮點數字,則會使用已根據十進位數精準度轉換為十進位浮點數字的十進位數暫時副本,在十進位浮點中執行作業。 如果十進位數的精準度小於 17 ,則十進位數會轉換為 DECFLOAT (16) 數字; 否則,十進位數會轉換為 DECFLOAT (34) 數字。 然後套用 2-decimal 浮點運算元的規則。
浮點及十進位浮點運算元
如果一個運算元是浮點 數字 (REAL 或 DOUBLE) ,而另一個運算元是 DECFLOAT (n) 數字,則會使用已轉換為 DECFLOAT (n) 數字之浮點數字的暫時副本,以十進位浮點執行作業。
兩個十進位浮點運算元
如果兩個運算元都是 DECFLOAT (n),則會在 DECFLOAT (n)中執行作業。 如果一個運算元是 DECFLOAT (16) ,而另一個運算元是 DECFLOAT (34),則會在 DECFLOAT (34)中執行作業。

小數浮點數的一般算術運算規則

下列一般規則適用於十進位浮點資料類型上的所有算術運算:
  • 在有限數上的每一個運算都在可能的情況下使用整數算術來計算精確的數學結果。

    如果理論精確結果的係數不超過反映其精準度的位數 (16 或 34) ,則會用於結果而不變更 (除非有下溢或溢位條件)。 如果係數超過反映其精準度的位數,則會四捨五入至反映其精準度的位數 (16 或 34) ,而指數會增加移除的位數。

    CURRENT DECFLOAT ROUNDING MODE 特別暫存器決定捨入模式。

    如果已調整結果指數的值小於 Emin,則已計算的係數和指數會形成結果,除非指數的值小於 Eminy,在此情況下,指數會設為 Eminy,係數會四捨五入 (可能為零) 以符合指數的調整,且符號會維持不變。 如果此捨入作業產生不精確的結果,則會傳回下溢異常狀況。

    如果結果的調整指數值大於 Emax,則會傳回溢位異常狀況。 在此情況下,結果會定義為溢位異常狀況,且可能無限。 它具有與理論結果相同的符號。

  • 使用特殊值無限大的算術遵循一般規則,其中負無限大小於每個有限數,正無限大大於每個有限數。 根據這些規則,無限結果總是精確的。 特定使用 infinity 會傳回無效的作業條件。 下列清單顯示可能導致無效作業條件的作業。 當其中一個運算元無限,但另一個運算元不是 NaN (無聲或信號) 時,此類運算的結果會是 NaN 。
    • 在加法或減法運算期間將 + infinity 新增至 -infinity
    • 將 0 乘以 + 無限或 -infinity
    • 將 + infinity 或 -infinity 除以 + infinity 或 -infinity
    • QUANTIZE 函數的任一引數是 + infinity 或 -infinity
    • POWER 函數的第二個引數是 + 無限或 -infinity
    • 信號 NaN 是算術運算的運算元
    下列規則適用於算術運算及 NaN 值:
    • 具有 NaN (無聲或信號) 運算元之任何算術運算的結果為 NaN。 結果的正負號會從第一個運算元 (即信號 NaN) 複製; 如果兩個運算元都不是信號,則會從第一個運算元 (即 NaN) 複製正負號。 每當結果是 NaN時,結果的符號僅取決於所複製的運算元。
    • 只有在運算元有不同符號且都不是 NaN時,乘法或除法運算的結果符號才是負數。
    • 只有在結果小於零且兩個運算元都不是 NaN時,加法或減法運算的結果符號才會是負數,但下列情況除外,其中結果是 -0:
      • 結果會捨入為 0 ,且值在捨入之前會有負號
      • 從 -0 扣除 0
      • 新增具有相反符號的運算元,或扣除具有相同符號的運算元; 結果具有係數 0 ,且捨入模式為 ROUND_FLOOR
      • 運算元會相乘或除以,結果的係數為 0 ,且運算元的符號不同
      • POWER 函數的第一個引數是 -0 ,第二個引數是正數奇數
      • CEIL、FLOOR 或 SQRT 函數的引數是 -0
      • ROUND 或 TRUNCATE 函數的第一個引數是 -0
下列範例顯示特殊小數浮點數值作為運算元:
   INFINITY + 1          = INFINITY
   INFINITY + INFINITY   = INFINITY
   INFINITY + -INFINITY  = NAN         -- warning
   NAN + 1               = NAN
   NAN + INFINITY        = NAN
   1 - INFINITY          = -INFINITY
   INFINITY - INFINITY   = NAN         -- warning
   -INFINITY - -INFINITY = NAN         -- warning
   -0.0 - 0.0E1          = -0.0
   -1.0 * 0.0E1          = -0.0
   1.0E1 / 0             = INFINITY    -- warning
   -1.0E5 / 0.0          = -INFINITY   -- warning
   1.0E5 / -0            = -INFINITY   -- warning
   INFINITY / -INFINITY  = NAN         -- warning
   INFINITY / 0          = INFINITY
   -INFINITY / 0         = -INFINITY
   -INFINITY / -0        = INFINITY

使用者定義類型作為算術運算子的運算元

弱類型化特殊類型運算元可以與算術運算子搭配使用,前提是算術運算子支援弱類型化特殊類型的來源類型。 不需要建立其他使用者定義函數來支援弱類型化特殊類型運算元的算術運算。

強烈類型化使用者定義的類型無法與算術運算子一起使用,即使其來源資料類型是數值也一樣。 若要執行算術運算,請以算術運算子作為其來源來建立函數。 例如,如果有強烈類型化的特殊類型 INCOME 和 EXPENSES ,兩者都有 DECIMAL (8, 2) 資料類型,則可以使用下列使用者定義函數 REVENUE 來從另一個中扣除一個。
   CREATE FUNCTION REVENUE (INCOME, EXPENSES)
     RETURNS DECIMAL(8,2) SOURCE "-" (DECIMAL, DECIMAL)
或者,負 (-) 運算子可能會使用使用者定義函數來超載,以扣除新的資料類型。
   CREATE FUNCTION "-" (INCOME, EXPENSES)
     RETURNS DECIMAL(8,2) SOURCE "-" (DECIMAL, DECIMAL)

具有位元運算子的表示式

The bitwise operators BITAND (&), BITOR (|), BITXOR (ˆ), and BITNOT (~) correspond to the similarly named scalar functions described in BITAND、BITANDNOT、BITOR、BITXOR 及 BITNOT 純量函數.

如果位元表示式中有任何運算元可以是空值,則結果可以是空值。 如果位元表示式中有任何運算元具有空值,則表示式的結果為空值。

一元位元 BITNOT (~) 字首運算子會反轉它所套用之運算元的每一個位元。 如果值 x 的資料類型為 DECIMAL、REAL、DOUBLE 或 DECFLOAT (16) ,則 ~x 的資料類型為 DECFLOAT (34); 否則,資料類型與 x的資料類型相同。

表 5. 二進位位元運算子
位元運算子 NAME 說明
& BITAND 結果是位元型樣,其中每個位元都是對輸入引數的對應位元執行邏輯 AND 運算的結果。
| BITOR 結果是位元型樣,其中每一個位元都是對輸入引數的對應位元執行邏輯 OR 運算的結果。
^ BITXOR 結果是位元型樣,其中每一個位元都是在輸入引數的對應位元上執行邏輯 XOR (異或) 運算的結果。
If the data type of either operand in a bitwise BITAND (&), BITOR (|), or BITXOR (ˆ) expression is DECFLOAT, the data type of the result is DECFLOAT(34). 否則,結果的資料類型是其資料類型在資料類型優先順序中排名最高的運算元的資料類型 (請參閱 表 1)。

在執行按位元運算之前,使用 CAST 規格的規則將非 LOB 字串的運算元轉換為 DECFLOAT (34)。 如需相關資訊,請參閱 在資料類型之間強制轉型。 包含圖形字串運算元的位元作業只能針對 Unicode 資料庫執行。

作業優先順序

括弧及解除參照作業內的表示式會先從左至右評估。 (括弧也用於全選、搜尋條件及函數中。 不過,不應使用它們來任意分組 SQL 陳述式內的區段。) 如果未以括弧指定評估順序,則會依下列順序來評估運算子:
  1. 單元 BITNOT (~)
  2. 一元正數 (+) 或一元負數 (-) 字首
  3. 指數 (**)
  4. 乘法 (*)、除法 (/)、模數 (%)或連結 (CONCAT 或 | |)
  5. 加法 (+) 或減法 (-)
  6. BITAND (&), BITOR (|), or BITXOR (^).
  7. 述詞。
  8. 邏輯 NOT。
  9. 邏輯 AND。
  10. 邏輯 OR。
會從左到右評估相同優先順序層次的運算子。
圖 1. 說明作業優先順序的範例
sqls0opr

純量全選 (scalar fullselect)

Scalar fullselect
Read syntax diagramSkip visual syntax diagram(fullselect)

純量全選 是用括弧括住的全選,它會傳回由單一直欄值組成的單一列。 如果全選未傳回列,則表示式的結果為空值。 如果選取清單元素是只是直欄名稱或取消參照作業的表示式,則結果直欄名稱會以直欄名稱為基礎。 純量全選所需的授權與 SQL 查詢所需的授權相同。

相容性特性

SQL_COMPAT 廣域變數設為 'NPS'時:
  • 符號 ^ 解譯為指數運算子 (相當於 **) ,而不是 BITXOR 運算子。 符號 ** 也會解譯為指數運算子。
  • 符號 # 會解譯為 BITXOR 運算子。