Miscellaneous language elements
<< Reserved words and keywords | FB 2.5 Language Reference | Data types and subtypes >>
Miscellaneous language elements
-- (single-line comment)
Added in: 1.0
Changed in: 1.5
Description
A line starting with "--" (two dashes) is a comment and will be ignored. This also makes it easy to quickly comment out a line of SQL.
In Firebird 1.5 and up, the "--" can be placed anywhere on the line, e.g. after an SQL statement. Everything from the double dash to the end of the line will be ignored.
Example
-- a table to store our valued customers in: create table Customers ( name varchar(32), added_by varchar(24), custno varchar(8), purchases integer -- number of purchases )
Notice that the second comment is only allowed in Firebird 1.5 and up.
Hexadecimal notation for numerals
Added in: 2.5
Description
In Firebird 2.5 and up, integer values can be entered in hexadecimal notation. Numbers with 1–8 hex digits will be interpreted as INTEGERs; numbers with 9–16 hex digits as BIGINTs.
Syntax
0{x|X}<hexdigits>
<hexdigits> ::= 1–16 of <hexdigit>
<hexdigit> ::= one of 0..9, A..F, a..f
Examples
select 0x6FAA0D3 from rdb$database -- returns 117088467 select 0x4F9 from rdb$database -- returns 1273 select 0x6E44F9A8 from rdb$database -- returns 1850014120 select 0x9E44F9A8 from rdb$database -- returns -1639646808 (an INTEGER) select 0x09E44F9A8 from rdb$database -- returns 2655320488 (a BIGINT) select 0x28ED678A4C987 from rdb$database -- returns 720001751632263 select 0xFFFFFFFFFFFFFFFF from rdb$database -- returns -1
- Hex numbers in the range
0 .. 7FFF FFFFare positiveINTEGERswith values between0 .. 2147483647decimal. You can force them toBIGINTby prepending enough zeroes to bring the total number of hex digits to nine or above, but that only changes their type, not their value. - Hex numbers between
8000 0000 .. FFFF FFFFrequire some attention:- When written with eight hex digits, as in
0x9E44F9A8, they are interpreted as 32-bitINTEGERvalues. Since their leftmost bit (sign bit) is set, they map to the negative range-2147483648 .. -1decimal. - With one or more zeroes prepended, as in
0x09E44F9A8, they are interpreted as 64-bitBIGINTsin the range0000 0000 8000 0000 .. 0000 0000 FFFF FFFF. The sign bit isn't set now, so they map to the positive range2147483648 .. 4294967295decimal.
- When written with eight hex digits, as in
- Hex numbers between
1 0000 0000 .. 7FFF FFFF FFFF FFFFare all positiveBIGINTs. - Hex numbers between
8000 0000 0000 0000 .. FFFF FFFF FFFF FFFFare all negativeBIGINTs.
#HexadecímalNotationForBinaryHexadecimal notation for "binary" strings
Added in: 2.5
Description
In Firebird 2.5 and up, string literals can be entered in hexadecimal notation. Each pair of hex digits defines a byte in the string. Strings entered this way will have character set OCTETS by default, but you can force the engine to interpret them otherwise with the introducer syntax.
Syntax
{x|X}'<hexstring>'
<hexstring> ::= an even number of <hexdigit>
<hexdigit> ::= one of 0..9, A..F, a..f
Examples
select x'4E657276656E' from rdb$database -- returns 4E657276656E, a 6-byte 'binary' string select _ascii x'4E657276656E' from rdb$database -- returns 'Nerven' (same string, now interpreted as ASCII text) select _iso8859_1 x'53E46765' from rdb$database -- returns 'Säge' (4 chars, 4 bytes) select _utf8 x'53C3A46765' from rdb$database -- returns 'Säge' (4 chars, 5 bytes)
Notes:
- It is up to the client interface how binary strings are displayed to the user.
Isql, for one, uses uppercase lettersA-F. FlameRobin uses lowercase letters. Other client programs may have other ideas, e.g. like this, with spaces between the bytes: '4E 65 72 76 65 6E'. - The hexadecimal notation allows you to insert any byte value (including
00) at any place in the string. However, if you want to coerce it to anything other thanOCTETS, it is your responsibilty that the byte sequence is valid for the target character set.
Shorthand casts
Available in: DSQL, ESQL, PSQL
Added in: IB
Description
When converting a string literal to a DATE, TIME or TIMESTAMP, Firebird allows the use of a shorthand "C-style" cast. This feature already existed in InterBase 6, but was never properly documented.
Syntax
datatype 'date/timestring'
Examples
update People set AgeCat = 'Old' where BirthDate < date '1-Jan-1943' insert into Appointments (Employee_Id, Client_Id, App_date, App_time) values (973, 8804, date 'today' + 2, time '16:00') new.lastmod = timestamp 'now';
CASE construct
Added in: 1.5
Description
A CASE construct returns exactly one value from a number of possibilities. There are two syntactic variants:
- The simple
CASE, comparable to a Pascalcaseor a Cswitch. - The searched
CASE, which works like a series ofif ... else if ... else ifclauses.
Simple CASE
Syntax
CASE <test-expr> WHEN <expr> THEN result [WHEN <expr> THEN result ...] [ELSE defaultresult] END
When this variant is used, <test-expr> is compared to <expr> 1, <expr> 2 etc., until a match is found, upon which the corresponding result is returned. If there is no match and there is an ELSE clause, defaultresult is returned. If there is no match and no ELSE clause, NULL is returned.
The match is determined with the "=" operator, so if <test-expr> is NULL, it won't match any of the <expr>s, not even those that are NULL.
The results don't have to be literal values: they may also be field or variable names, compound expressions, or NULL literals.
A shorthand form of the simple CASE construct is the DECODE() function, available since Firebird 2.1.
Example
select name,
age,
case upper(sex)
when 'M' then 'Male'
when 'F' then 'Female'
else 'Unknown'
end,
religion
from people
Searched CASE
Syntax
CASE HEN <bool_expr> THEN result [WHEN <bool_expr> THEN result ...] [ELSE defaultresult] END
Here, the <bool_expr>s are tests that give a ternary Boolean result: TRUE, FALSE, or NULL. The first expression evaluating to TRUE determines the result. If no expression is TRUE and there is an ELSE clause, defaultresult is returned. If no expression is TRUE and there is no ELSE clause, NULL is returned.
As with the simple CASE, the results don't have to be literal values: they may also be field or variable names, compound expressions, or NULL literals.
Example
CanVote = case
when Age >= 18 then 'Yes'
when Age < 18 then 'No'
else 'Unsure'
end;
See also:
Firebird Null Guide: Conditional statements and loops
back to top of page
<< Reserved words and keywords | FB 2.5 Language Reference | Data types and subtypes >>







