Skip to content

Unified SQL syntax

In some CCH Tagetik definitions, where SQL language can be entered manually, you can use a unified custom syntax for certain functions (see table below), and this will then be translated into the language of the current vendor runtime DB. This functionality allows you to create “independent vendor DB” setups, which can be exported and imported on other application environments installed on other vendor DB without having to then convert the SQL syntax manually.

The following tools allow this syntax to be used:

  • ETL (Extraction Transformation and Loading),
  • DTP (Data Transformation Package),
  • QDL (Quick Data Loader)
  • Query-type application objects used in the QDL

Square brackets indicate that the function’s topic is optional.

Syntax SQLServer Oracle Postgres Hana
F_SUBSTR(FIELD, 1, 3) SUBSTRING(FIELD, 1, 3) SUBSTR(FIELD, 1, 3) SUBSTRING(FIELD, 1, 3) SUBSTRING(FIELD, 1, 3)
F_LENGTH(FIELD) LEN(FIELD) LENGTH(FIELD) LENGTH(FIELD) LENGTH(FIELD)
F_INSTR(FIELD, WHAT) CHARINDEX(WHAT, FIELD) INSTR(FIELD, WHAT) POSITION(WHAT IN FIELD) INSTR(FIELD, WHAT)
F_CONCAT +
F_LPAD(FIELD, N, EXPR) RIGHT(REPLICATE(EXPR, N) + FIELD, N) LPAD(FIELD, N, EXPR) LPAD(FIELD, N, EXPR) LPAD(FIELD, N, EXPR)
F_TO_CHAR(FIELD, [format]) CONVERT(VARCHAR, FIELD, [format_code]) TO_CHAR(FIELD,[format]) TO_CHAR(FIELD, format) TO_CHAR(FIELD,[format])
F_TO_DATE(FIELD, [format]) CONVERT(DATETIME, FIELD,[format_code]) TO_DATE(FIELD,[format]) TO_DATE(FIELD, format) TO_DATE(FIELD, [format])
F_TO_NUMBER(FIELD, [CifreTotali [, CifreDecimali]]) CONVERT(NUMERIC[(CifreTotali[,CifreDecimali])], FIELD) TO_NUMBER(FIELD) TO_NUMBER(FIELD, format) TO_NUMBER(FIELD)
F_TO_TIMESTAMP(FIELD, [format]) CONVER (DATETIME, FIELD, [format]) TO_TIMESTAMP(FIELD, [format]) TO_TIMESTAMP(FIELD, [format]) TO_TIMESTAMP(FIELD, [format])
F_DATE_TO_TIMESTAMP(FIELD) CONVERT(DATETIME, FIELD) TO_TIMESTAMP(FIELD) CAST (FIELD AS TIMESTAMP) TO_TIMESTAMP(FIELD)
F_NVL(FIELD, VALUE) ISNULL(FIELD, VALUE) NVL(FIELD, VALUE) COALESCE(FIELD, VALUE) IFNULL(FIELD, VALUE)
F_NEWDATE GETDATE() SYSDATE current_timestamp current_timestamp
F_EXCELDATE(FIELD, [format]) CONVERT(VARCHAR(10), DATEADD(d, CAST(FIELD AS FLOAT),'1899-12-30'), [format]) TO_CHAR(TO_DATE('1899-12-30', 'YYYY-MM-DD') + FIELD,[format]) TO_CHAR(TO_DATE('1899-12-30', 'YYYY-MM-DD') + FIELD::int, format) TO_CHAR(ADD_DAYS(TO_DATE ('1899-12-30', 'YYYY-MM-DD'), FIELD), 'YYYY-MM-DD')
F_DATEADD(day, N, FIELD) DATEADD(day, N, FIELD) FIELD + INTERVAL 'N' day FIELD + INTERVAL 'N day' ADD_DAYS(FIELD, N)
F_DATEADD(month, N, FIELD) DATEADD(month, N, FIELD) FIELD + INTERVAL 'N' month FIELD + INTERVAL 'N month' ADD_MONTHS(FIELD, N)
F_DATEADD(year, N, FIELD) DATEADD(year, N, FIELD) FIELD + INTERVAL 'N' year FIELD + INTERVAL 'N year' ADD_YEARS(FIELD, N)
F_YEAR(FIELD) YEAR(FIELD) EXTRACT(year FROM FIELD) EXTRACT(year FROM FIELD) YEAR(FIELD)
F_MONTH(FIELD) MONTH(FIELD) EXTRACT(month FROM FIELD) EXTRACT(month FROM FIELD) MONTH(FIELD)
F_DAY(FIELD) DAY(FIELD) EXTRACT(day FROM FIELD) EXTRACT(day FROM FIELD) DAYOFMONTH(FIELD)
F_EOMONTH(theDateTime) EOMONTH(theDateTime) TRUNC(LAST_DAY(theDateTime)) (date_trunc('MONTH', theDateTime) + INTERVAL '1 MONTH - 1 day')::date) LAST_DAY(theDateTime)
F_EOMONTH(theDatetime, Offset) EOMONTH(theDatetime, Offset) TRUNC(LAST_DAY(ADD_MONTHS(theDatetime, theOffset))) ((date_trunc('MONTH', theDatetime + INTERVAL 'theOffset MONTH') + INTERVAL '1 MONTH - 1 day')::date) LAST_DAY(ADD_MONTHS(theDateTime, theOffset))
F_DATEDIFF(DAY, firstdate,seconddate) DATEDIFF(DAY, firstdate, seconddate) (TO_DATE(TO_CHAR(seconddate,'DD-MON-YYYY')) - TO_DATE(TO_CHAR(firstdate,'DD-MON-YYYY'))) (seconddate::date - firstdate::date) DAYS_BETWEEN(TO_DATE(firstdate), TO_DATE(seconddate))
F_DATEDIFF(MONTH, firstdate,seconddate) DATEDIFF(MONTH, firstdate, seconddate) ((EXTRACT(YEAR from seconddate) - EXTRACT(YEAR from firstdate)) * 12 + (EXTRACT(MONTH from seconddate) - EXTRACT(MONTH from firstdate))) ((DATE_PART('year', seconddate) - DATE_PART('year', firstdate)) * 12 + (DATE_PART('month', seconddate) - DATE_PART('month', firstdate))) ((YEAR(seconddate) - YEAR(firstdate)) * 12 + (MONTH(seconddate) - MONTH(firstdate)))
F_DATEDIFF(YEAR, firstdate,seconddate) DATEDIFF(YEAR, firstdate, seconddate) (EXTRACT(YEAR from seconddate) - EXTRACT(YEAR from firstdate)) (DATE_PART('year', seconddate) - DATE_PART('year', firstdate)) (YEAR(seconddate) - YEAR(firstdate))
F_STUFF(inputString, startIndex, length, replaceWithString) STUFF (character_expression , start , length , replaceWith_expression) substr(pExpr, 1, pStart - 1) pReplace
F_dbo. dbo.
F_STRING_AGG(expression, separator) STRING_AGG(expression, separator) LISTAGG(expression, separator) STRING_AGG(expression, separator) STRING_AGG(expression, separator)
F_CEILING(numeric) CEILING(numeric) CEIL(numeric) CEILING(numeric) CEIL(numeric)
F_CHAR(numeric) CHAR(numeric) CHR(numeric) CHR(numeric) CHAR(numeric)
F_ISNUMERIC(expression) ISNUMERIC(expression) CASE WHEN regexp_like(%1$s, '^(-)?\d+(.\d+)?(\,\d+)?$') THEN 1 ELSE 0 END CASE WHEN %1$s ~ '^(-)?\d+(.\d+)?(\,\d+)?$' is true THEN 1 ELSE 0 END locate_regexpr(START '^(-)?\d+(.\d+)?(\,\d+)?$' IN %1$s)
F_EQUAL(expr1, expr2) CAST(expr1 AS VARBINARY(MAX)) = CAST(expr2 AS VARBINARY(MAX)) expr1 = expr2 expr1 = expr2 expr1 = expr2
F_DOUBLEQUOTE([Campo1]) ''Campo1'' ''Campo1'' ''Campo1'' ''Campo1''
F_MD5(String) HASHBYTES('MD5', String) STANDARD_HASH(String, 'MD5') ('\x'
F_MOD(num1,num2) num1 % num2 MOD(num1,num2) MOD(num1,num2) MOD(num1,num2)
F_EXT_DOUBLEQUOTE ''FIELD'' ''FIELD'' ''FIELD'' ''FIELD''
F_PREVIEW JSON_VALUE(FIELD, '$.preview') JSON_VALUE(FIELD, '$.preview') JSON_EXTRACT_PATH_TEXT(FIELD::json, 'preview') JSON_VALUE(FIELD, '$.preview')

To use unified sql syntax, such as an EXECUTE like:

EXECUTE 'select cod_periodo,F_NVL(note, ''A'') from dati_saldi_ic where cod_azienda=''A3'' '

it is necessary to replace the superscripts with the F_DOUBLEQUOTE as follows:

EXECUTE 'select cod_periodo,F_NVL(note, F_DOUBLEQUOTE(A)) from dati_saldi_ic where cod_azienda=''A3'' '

Note: the F_DOUBLEQUOTE must be used when, in one of the functions listed above, it is necessary to enclose a parameter between two single quotes (F_NVL(notes, ''A'')).

Attention: When writing queries, the following system tables cannot be used for the Postgres DB:

  • pg_role
  • pg_user​
  • pg_group​
  • pg_database​
  • pg_stat_activity​
  • pg_stat_database​
  • pg_stat_database_conflicts​
  • information_schema

Examples:

  • F_TO_CHAR

SELECT * FROM DATI_SALDI_LORDI WHERE F_TO_CHAR(DATEUPD,'DD/MM/YYYY') = '01/09/2017'

Translations:

SQLServer: CONVERT(VARCHAR,DATEUPD,103)

ORACLE: TO_CHAR(DATEUPD,'DD/MM/YYYY')

POSTGRES: TO_CHAR(DATEUPD,'DD/MM/YYYY')

HANA: TO_CHAR(DATEUPD,'DD/MM/YYYY')

SELECT * FROM DATI_SALDI_LORDI WHERE F_TO_CHAR(DATEUPD) = '01/09/2017'

Translations:

SQLServer: CONVERT(VARCHAR,DATEUPD)

ORACLE: TO_CHAR(DATEUPD)

POSTGRES: error (as reported in the table, the two topics are mandatory)

HANA: TO_CHAR(DATEUPD)

SELECT F_TO_CHAR(IMPORTO, '999999.999') FROM DATI_SALDI_LORDI

Translations:

SQLServer: CONVERT(VARCHAR, IMPORTO)

ORACLE: TO_CHAR(IMPORTO, '999999.999')

POSTGRES: TO_CHAR(IMPORTO, '999999.999')

HANA: TO_CHAR(IMPORTO, '999999.999')

  • F_TO_DATE

SELECT F_TO_DATE('01/09/2017','DD/MM/YYYY') FROM DATI_SALDI_LORDI

Note: the separator character of the first and second parameter must coincide.

Translations:

SQLServer: CONVERT(DATETIME,'01/09/2017,103)

ORACLE: TO_DATE('01/09/2017,'DD/MM/YYYY')

POSTGRES: TO_DATE('01/09/2017,'DD/MM/YYYY')

HANA: TO_DATE('01/09/2017,'DD/MM/YYYY')

SELECT F_TO_DATE('01/09/2017') FROM DATI_SALDI_LORDI

Translations:

SQLServer: CONVERT(DATETIME,'01/09/2017')

ORACLE: TO_DATE('01/09/2017')

POSTGRES: error (as reported in the table, the two topics are mandatory)

HANA: TO_DATE('01/09/2017')

  • F_TO_NUMBER

SELECT *, F_TO_NUMBER( '11998.261', 7, 2) FROM DATI_SALDI_LORDI

Translations:

SQLServer: CONVERT(NUMERIC(7, 2),'11998.261')

ORACLE: TO_NUMBER('11998.261') non tiene conto dei parametri cifre totali e cifre decimali

POSTGRES: TO_NUMBER('11998.261', '99999.99')

HANA: TO_NUMBER('11998.261') does not take account of the total figure or decimal digit parameters

Caution: an error will be returned if the total number of figures specified is less than the number of decimal figures (e.g. F_TO_NUMBER( '11998.261', 2, 7)), with the exception of Oracle and Hana, which do not take account of these two parameters.

SELECT *, F_TO_NUMBER( '11998.261', 5) FROM DATI_SALDI_LORDI

Translations:

SQLServer: CONVERT(NUMERIC(5),'11998.261')

ORACLE: TO_NUMBER('11998.261') non tiene conto dei parametri cifre totali e cifre decimali

POSTGRES: TO_NUMBER('11998.261', '99999.')

HANA: TO_NUMBER('11998.261') does not take account of the total figure or decimal digit parameters

Caution: an error will be returned if the number of figures comprising entire part of the first parameter is greater than the specified number of total figures (e.g. F_TO_NUMBER( '11998.261', 3)), with the exception of Oracle and Hana.

SELECT *, F_TO_NUMBER( '11998.261') FROM DATI_SALDI_LORDI

Translations:

SQLServer: CONVERT(NUMERIC,'11998.261')

ORACLE: TO_NUMBER('11998.261')

POSTGRES: error, at least the number of total figures must be specified.

HANA: TO_NUMBER('11998.261')

  • F_EXT_DOUBLEQUOTE

SELECT F_EXT_DOUBLEQUOTE(F_TO_DATE('01/01/2024', 'DD/MM/YYYY')) FROM DATI_SALDI_LORDI

Translations:

SQLServer: CONVERT(DATETIME,''01/01/2024'',103)

ORACLE:TO_DATE(''01/01/2024'',''DD/MM/YYYY'')

POSTGRES: TO_DATE(''01/01/2024'',''DD/MM/YYYY'')

HANA: TO_DATE(''01/01/2024'',''DD/MM/YYYY'')

Attention: F_EXT_DOUBLEQUOTE applies to strings or other single functions. If you have several disjointed functions, it must be repeated externally for each block.

F_EXT_DOUBLEQUOTE(FIELD)

Attention: the F_EXT_DOUBLEQUOTE only affects single quotes. If an argument without quotes or with double quotes is passed to it, it does not perform any transformation.

  • F_EXT_DOUBLEQUOTE(FIELD) -> restituisce FIELD

  • F_EXT_DOUBLEQUOTE('FIELD') -> restituisce ''FIELD''

  • F_EXT_DOUBLEQUOTE(''FIELD'') -> restituisce ''FIELD''

  • F_PREVIEW

Note: the FIELD field must contain a json string structured as follows: `{

"key": {

    "storage": "storage type",

    "id": "rich text oid",

    "reference": "[db]\\\\[aw]\\\\[dataset]",

    "version": 1

},

"preview": "preview text"

}`