Типи даних і функції SQLScript
Типи даних і функції SQLScript
Section titled “Типи даних і функції SQLScript”Скалярні типи SAP HANA діляться на чотири категорії: рядки, дата/час, числа, бінарні. До кожної категорії — набір вбудованих SQL-функцій. Ця сторінка — швидкий лук-ап: який тип у яких сценаріях, які функції є, як конвертувати між форматами, на що звернути увагу.
Рядкові типи
Section titled “Рядкові типи”| Тип | Призначення | Розмір |
|---|---|---|
VARCHAR(n) | ASCII / однобайтний | до n байт |
NVARCHAR(n) | Unicode (UCS-2) | до n символів |
ALPHANUM(n) | Алфавітно-цифровий, з лідуючими нулями | до n |
SHORTTEXT(n) | NVARCHAR з повнотекстовим індексом | до n |
CLOB | Великий ASCII-текст | до 2 ГБ |
NCLOB | Великий Unicode-текст | до 2 ГБ |
TEXT | NCLOB з повнотекстовим індексом | до 2 ГБ |
⚠️ Грабля: VARCHAR vs NVARCHAR
У ABAP-ECC до S/4HANA текстові поля типу
CHAR/STRINGмапилися вVARCHAR. У S/4HANA та усіх нових об’єктах Unicode — стандарт, тому маєш бутиNVARCHAR. Не плутай —VARCHAR('Jörg')не зламається, алеöу деяких налаштуваннях відображатиметься криво.
Конвертації рядків
Section titled “Конвертації рядків”SELECT TO_VARCHAR(123) FROM dummy; -- '123'SELECT TO_NVARCHAR(123) FROM dummy; -- N'123'SELECT TO_VARCHAR(DATE'2024-12-31', 'DD.MM.YYYY') FROM dummy; -- '31.12.2024'SELECT TO_INT('42') FROM dummy; -- 42SELECT TO_DECIMAL('1.5', 10, 2) FROM dummy; -- 1.50Функції для рядків
Section titled “Функції для рядків”| Функція | Що робить |
|---|---|
LENGTH(s) | К-сть символів |
LCASE(s) / LOWER(s) | У нижній регістр |
UCASE(s) / UPPER(s) | У верхній регістр |
INITCAP(s) | Перші літери слів — великі |
LTRIM(s), RTRIM(s), TRIM(s) | Прибирає пробіли |
LPAD(s, n, c), RPAD(s, n, c) | Доповнює до довжини n символом c |
LEFT(s, n), RIGHT(s, n) | Перші / останні n символів |
SUBSTRING(s, start, length) | Вирізає підрядок |
LOCATE(s, substr) | Позиція першого входження (0 якщо нема) |
REPLACE(s, from, to) | Заміна |
CONCAT(a, b) або a || b | Конкатенація |
CONCAT_NAZ(a, b) | Конкатенація з ігноруванням NULL |
REPEAT(s, n) | Повторити n разів |
REVERSE(s) | Перевернути |
BINTOHEX(b), HEXTOBIN(s) | Двійкові ↔ hex |
SELECT firstname || ' ' || lastname AS name, LPAD(TO_VARCHAR(id), 10, '0') AS padded_id, SUBSTRING(title, 1, 50) AS short_title, UPPER(LEFT(country, 3)) AS codeFROM users;Regex-функції
Section titled “Regex-функції”SELECT LIKE_REGEXPR(text, '^[A-Z]\d+$') AS is_match, LOCATE_REGEXPR('\d+' IN text) AS first_num_pos, OCCURRENCES_REGEXPR('\d+' IN text) AS num_count, REPLACE_REGEXPR('\s+' IN text WITH ' ') AS normalized, SUBSTRING_REGEXPR('\d+' IN text) AS first_numFROM logs;SQLSCRIPT_STRING library
Section titled “SQLSCRIPT_STRING library”Окрема бібліотека (з SAP HANA 2.0 SPS 04) для роботи з рядками — split, join, trim, format. Виклик через префікс:
DO BEGIN USING sqlscript_string AS s; DECLARE arr NVARCHAR(20) ARRAY; arr := s:split('a,b,c,d', ','); -- розбити на елементи SELECT * FROM UNNEST(:arr);END;Дата і час
Section titled “Дата і час”| Тип | Формат | Розмір |
|---|---|---|
DATE | YYYY-MM-DD | 4 байти |
TIME | HH24:MI:SS | 4 байти |
SECONDDATE | YYYY-MM-DD HH24:MI:SS, точність до сек | 8 байт |
TIMESTAMP | YYYY-MM-DD HH24:MI:SS.FFFFFFF, точність до 100 нс | 8 байт |
Літерали — з префіксом DATE, TIME, TIMESTAMP:
DATE'2024-12-31'TIME'15:42:04.123'TIMESTAMP'2024-12-31 23:59:59.999'⚠️ Грабля: DATS != DATE
ABAP-тип
DATSзберігається якVARCHAR(8)у форматіYYYYMMDD. Це рядок, не дата. У SQLScript віднімання двох DATS-полів того самого місяця дасть правильний результат випадково — як цілі числа. Як тільки місяці різні, віднімання обчислюється як арифметика рядків і дає сміття.Перетворюй у
DATEчерезTO_DATE(dats)перед арифметикою — і назад черезTO_DATS(date)після, якщо треба зберегти.
Конвертації дат
Section titled “Конвертації дат”TO_DATE('2024-12-31') -- з рядка (auto-detect)TO_DATE('31=12=2024', 'DD=MM=YYYY') -- з кастомним форматомTO_DATS(DATE'2024-12-31') -- DATE → 'YYYYMMDD' (для ABAP)TO_DATE('20241231') -- '20241231' → DATETO_VARCHAR(CURRENT_DATE, 'DD.MM.YYYY')-- DATE → форматований рядокPatterns для TO_VARCHAR:
| Pattern | Приклад |
|---|---|
YY | 24 |
YYYY | 2024 |
MM | 12 |
DD | 31 |
Q | 4 (квартал) |
WW | 52 (тиждень року) |
MON | DEC |
MONTH | DECEMBER |
RM | XII (римські цифри) |
DDD | 366 (день року) |
Арифметика з датами
Section titled “Арифметика з датами”ADD_DAYS(DATE'2024-01-31', 1) -- 2024-02-01ADD_MONTHS(DATE'2024-01-31', 1) -- 2024-02-29 (round до останнього дня)ADD_MONTHS_LAST(DATE'2024-02-28', 1) -- 2024-03-31 (last day → last day)ADD_YEARS(DATE'2024-02-29', 1) -- 2025-02-28ADD_WORKDAYS(d, n, 'CALID') -- з factory calendarADD_SECONDS(TIMESTAMP'...', 60)DAYS_BETWEEN(d1, d2) -- різниця в дняхSECONDS_BETWEEN(t1, t2)WORKDAYS_BETWEEN(d1, d2, 'CALID')Витягання компонентів
Section titled “Витягання компонентів”YEAR(d), QUARTER(d), MONTH(d), DAYOFMONTH(d),WEEK(d), WEEKDAY(d), DAYOFYEAR(d),HOUR(t), MINUTE(t), SECOND(t),EXTRACT(YEAR FROM d), EXTRACT(MONTH FROM d) -- універсальний синтаксисСистемні дата/час
Section titled “Системні дата/час”CURRENT_DATE -- DATECURRENT_TIME -- TIMECURRENT_TIMESTAMP -- TIMESTAMP, локальнийCURRENT_UTCTIMESTAMP -- TIMESTAMP, UTCNOW() -- те самеLOCALTOUTC(ts, 'CET') -- з локальної у UTCUTCTOLOCAL(ts, 'CET') -- з UTC у локальнуЧислові типи
Section titled “Числові типи”| Тип | Категорія | Діапазон |
|---|---|---|
TINYINT | Integer | 0..255 |
SMALLINT | Integer | ±32 767 |
INTEGER | Integer | ±2 147 483 647 |
BIGINT | Integer | ±9.2 × 10¹⁸ |
DECIMAL(p,s) | Fixed-point | до 38 цифр, s — знаки після коми |
SMALLDECIMAL | Decimal floating | flexible, точно |
DECIMAL без (p,s) | Decimal floating | flexible, точно |
REAL | Binary floating | 32 біти |
DOUBLE | Binary floating | 64 біти |
⚠️ Грабля: REAL і DOUBLE — приблизні
TO_DOUBLE(1.2) - TO_DOUBLE(0.1)дає1.0999999999999999, а не1.1. Для грошових сум, кількостей, всього де важлива точність — використовуйDECIMAL.DOUBLE— для наукових/інженерних обчислень.
Базова арифметика
Section titled “Базова арифметика”| Функція | Призначення |
|---|---|
ABS(n) | Модуль |
SIGN(n) | Знак: -1, 0, 1 |
UMINUS(n) | Зміна знаку |
MOD(a, b) | Залишок від ділення |
DIV(a, b) | Цілочислове ділення |
CEIL(n) | Округлення вгору |
FLOOR(n) | Округлення вниз |
ROUND(n, d) | Округлення до d знаків |
TRUNCATE(n, d) | Усічення до d знаків |
Степені і логарифми
Section titled “Степені і логарифми”| Функція | Призначення |
|---|---|
POWER(b, e) | b у степені e |
SQRT(n) | Корінь квадратний |
EXP(n) | e^n |
LN(n) | Натуральний логарифм |
LOG(b, n) | Логарифм за основою b |
Тригонометрія
Section titled “Тригонометрія”SIN, COS, TAN, COT, ASIN, ACOS, ATAN, ATAN2(y,x), SINH, COSH, TANH. Аргументи — у радіанах.
Випадкові числа
Section titled “Випадкові числа”SELECT RAND() FROM dummy; -- DOUBLE з [0..1), швидкоSELECT RAND_SECURE() FROM dummy; -- те саме, криптостійкоГрошові суми і кількості
Section titled “Грошові суми і кількості”В HANA немає вбудованого звʼязку числового поля з валютою/одиницею — це робиться у CDS-аннотаціях або в коді. Для конвертацій:
CURRENCY_CONVERSION( amount => 100, source_unit => 'USD', target_unit => 'EUR', reference_date => CURRENT_DATE, error_handling => 'set to null', client => '100')
UNIT_CONVERSION( quantity => 1000, source_unit => 'KG', target_unit => 'T', error_handling => 'fail on error')Беруть курси з таблиць TCURR/TCURX і одиниці з T006. Обовʼязково задається error_handling: fail on error, set to null, keep unconverted.
Бінарні типи
Section titled “Бінарні типи”| Тип | Призначення | Розмір |
|---|---|---|
VARBINARY(n) | Послідовність байтів | до n байт |
BLOB | Великий бінарник | до 2 ГБ |
-- Літералx'FF AA 01' -- VARBINARY
-- КонвертаціїBINTOHEX(x'FF') -- 'FF' (NVARCHAR)HEXTOBIN('FF') -- x'FF'TO_BLOB(x'FF') -- VARBINARY → BLOBTO_VARBINARY('FF') -- з hex-рядкаБіти і байти
Section titled “Біти і байти”BIT_AND(a, b) -- побітове ІBIT_OR(a, b) -- побітове АБОBIT_XOR(a, b) -- виключне АБОBIT_NOT(a) -- інверсіяBITCOUNT(a) -- к-сть встановлених бітівBITSET(a, pos, bit) -- встановити бітBITUNSET(a, pos) -- скинути бітLENGTH(b) -- довжина в байтахУніверсальні конвертації
Section titled “Універсальні конвертації”CAST — стандартний SQL:
CAST('123' AS INTEGER)CAST(1.234 AS DECIMAL(10,2))CAST(NULL AS DATE)TO_* — HANA-специфічні, з опціональним форматом:
TO_INT(s), TO_BIGINT(s), TO_DECIMAL(s, p, s)TO_DOUBLE(s), TO_REAL(s)TO_DATE(s, fmt), TO_TIMESTAMP(s, fmt)TO_VARCHAR(v, fmt), TO_NVARCHAR(v, fmt)TO_BLOB(b), TO_CLOB(s), TO_NCLOB(s)TO_BINARY(s), TO_VARBINARY(s)⚠️ Грабля: TO_INT не падає
TO_INT('abc')повертаєNULL, не помилку. Якщо хочеш hard-fail — обгортай уCASEз перевіркою на формат, або використовуйTRY_CAST(повертає NULL замість винятку — тобто навпаки, для безпечного приведення).
NULL-aware функції
Section titled “NULL-aware функції”| Функція | Поведінка |
|---|---|
COALESCE(a, b, c, ...) | Перше не-NULL значення зі списку |
IFNULL(a, b) | Як COALESCE для двох аргументів |
NULLIF(a, b) | NULL якщо a = b, інакше a |
NVL(a, b) | Як IFNULL (Oracle-стиль) |
SELECT COALESCE(team, dept, 'unassigned') AS group_name, NULLIF(salary, 0) AS salary_or_null, IFNULL(comment, '') || '!' AS commentedFROM users;Що далі
Section titled “Що далі”- Запис у БД (CRUD) — INSERT, UPDATE, MERGE, DELETE з прикладами
- Імперативне SQLScript — змінні, цикли, курсори, винятки
- Декларативне SQLScript — SELECT, JOIN, CTE
- Основи мови SQLScript — синтаксис, процедури, функції