DI-ODBC SQL Grammar Quick Reference

DI-ODBC supports SELECT statements with FROM, but not SELECT DISTINCT or UNION. Also, some operators and functions are not supported. Here is a specification of the grammar supported by DI-ODBC driver:

<select-statement>

SELECT <select-columns> FROM <table-ref> [ WHERE <expression> ] [ GROUP BY <group-columns> [ HAVING <expression>] ] [ ORDER BY <order-columns> ] [ LIMIT <number> ] [ OFFSET <number> ]

As of DI-ODBC 7.1(7), this becomes:

SELECT <select-columns> [ FROM <table-ref> ] [ WHERE <expression> ] [ GROUP BY <group-columns> [ HAVING <expression>] ] [ ORDER BY <order-columns> ] [ LIMIT <number> ] [ OFFSET <number> ]

<select-columns>

<select-column> [ , <select-columns> ]

<select-column>

<column-ref> [ AS <name> ]

| <aggregate> [ AS <name> ]

As of DI-ODBC 7.1(7), this becomes:

<expression> [ AS <name> ]

<group-columns>

<column-ref> [ , <group-columns> ]

As of DI-ODBC 7.1(25), <group-columns> includes both column aliases and original column names.

<order-columns>

<order-column> [ , <order-columns> ]

<order-column>

<column-ref> [ ASC | DESC ]

<table-ref>

[ <name> . ] [ <name> . ] <name>

As of DI-ODBC 7.1(7), table reference includes:

| <select-statement> [ AS <name> ]

<column-ref>

[ <name> . ] <name>

<expression>

<literal>

| <column-ref>

| <operator>

| ( <expression> )

| <function>

<literal>

<number>

| <string>

| NULL

As of DI-ODBC 7.1(25), literal reference includes:

| <escaped-date>

| <escaped-timestamp>

<escaped-date>

{ d <string> }

(string is of the form 'YYYY-MM-DD')

<escaped-timestamp>

{ ts <string> }

(string is of the form 'YYYY-MM-DD' hh:mm:ss')

<operator>

<expression> + <expression>

| <expression> - <expression>

| <expression> * <expression>

| <expression> / <expression>

| <expression> = <expression>

| <expression> == <expression>

| <expression> <> <expression>

| <expression> != <expression>

| <expression> < <expression>

| <expression> <= <expression>

| <expression> > <expression>

| <expression> >= <expression>

| <expression> AND <expression>

| <expression> OR <expression>

| <expression> || <expression>

| NOT <expression>

| - <expression>

| <expression> ISNULL

| <expression> IS NULL

| <expression> IS NOT NULL

As of DI-ODBC 7.1(7), operators include:

| <expression> IN ( [ <in-expressions> ] )

| <expression> NOT IN ( [ <in-expressions> ] )

| <expression> BETWEEN <expression> AND <expression>

As of DI-ODBC 7.1(25), expressions include:

| <expression> + <interval-expression>

| <expression> - <interval-expression>

<in-expressions> (As of DI-ODBC 7.1(25))

<expression> [ , <expression> ]

<function>

<math-function>

| <string-function>

| <time-function>

| <misc-function>

| <aggregate>

| <di-function>

As of DI-ODBC 7.1(25), functions include:

| <escaped-function>

<math-function>

ABS( <expression> )

| ACOS( <expression> )

| ASIN( <expression> )

| ATAN( <expression> )

| CEILING( <expression> )

| COS( <expression> )

| COT( <expression> )

| DEGREES( <expression> )

| EXP( <expression> )

| FLOOR( <expression> )

| LOG( <expression> )

| LOG10( <expression> )

| MOD( <expression> )

| PI()

| POWER( <expression> )

| RADIANS( <expression> )

| RAND()

| SIGN( <expression> )

| SIN( <expression> )

| SQRT( <expression> )

| TAN( <expression> )

<string-function>

LOWER( <expression> )

| LCASE( <expression> )

| UPPER( <expression> )

| UCASE( <expression> )

| SUBSTRING( <expression>, <expression>, <expression> )

| CONCAT( <expression>, <expression> )

| LENGTH( <expression> )

<time-function>

CURRENT_DATE()

| CURDATE()

| NOW()

| DAYNAME( <expression> )

| MONTHNAME( <expression> )

| DAYOFMONTH( <expression> )

| MONTH( <expression> )

| YEAR( <expression> )

As of DI-ODBC 71.(25), time-functions include:

| EXTRACT( <time-unit> FROM <expression>)

| TIMESTAMP 'YYYY-MM-DD hh:mm:ss'

<time-unit>

YEAR

| MONTH

| DAY

<misc-function>

IFNULL( <expression>, <expression> )

| COALESCE( <expression>, <expression> )

<aggregate>

COUNT(*)

| COUNT(<expression>)

| COUNT(DISTINCT <expression>)

| SUM(<expression>)

| MIN(<expression>)

| MAX(<expression>)

| AVG(<expression>)

| STDEV(<expression>)

<di-function>

CALC(<expression>)

As of DI-ODBC 7.1(25), di-function includes:

| MEASURE(<expression>)

| EVAL(<string>)

<escaped-function> (As of DI-ODBC 7.1(25))

{ fn <function> }

<name>

a bare identifier, for example my_column_name

| a double-quoted identifier, for example "my column name"

<string>

a single-quoted string, for example 'my string'

(use two single-quotes to represent one inside the string, for example 'William ''The Bard'' Shakespeare')