موتور کوئرینویسی دادهلند بر پایه نگارش ۸ پایگاه داده MySQL توسعه یافته و با هدف افزایش توانمندی در تحلیل دادهها، بهبود کارایی پردازش و همچنین فراهمسازی امکان پیادهسازی تحلیلهای پیشرفته، نسخه گسترشیافته خود را تحت عنوان Dadeland SQL ارائه کرده است. این نسخه با بسط و افزودن توابع جدید به مجموعه استاندارد MySQL 8 توسعه یافته است. از این رو کاربران بدون نیاز به فراگیری یک سینتکس جدید، میتوانند در کنار دستورات استاندارد SQL، از توابع اختصاصی و تکمیلی دادهلند (با پیشوند dl_*) در تمامی محیطهای کوئرینویسی سیستم (از جمله بخشهای تحلیلی، پایپلاینهای تبدیل داده و فرآیندهای توزیع داده) بهرهمند شوند.
برای کار با مقادیر تاریخ و زمان و انجام تبدیلات و محاسبات تقویم شمسی در کوئریهای SQL از این توابع استفاده میشود:
| تابع و شیوه استفاده | خروجی | توضیحات |
|---|---|---|
dl_persian_date('2026-03-21') | '1405-01-01' | تاریخ میلادی را به تاریخ شمسی در ساختار استاندارد ۱۰ کاراکتری تبدیل میکند. |
dl_persian_date_time('2026-03-21 12:00:00') | '1405-01-01 12:00:00.000' | تاریخ و زمان میلادی را همراه با میلیثانیه به تاریخ و زمان شمسی تبدیل میکند. |
dl_persian_day('2026-03-21') | 1 | شماره روز در ماه شمسی را برمیگرداند (در صورت دریافت مقدار NULL عدد 0 بازمیگردد). |
dl_persian_dayname('2026-03-21') | 'شنبه' | نام فارسی روز هفته را بازمیگرداند. |
dl_persian_monthname('2026-03-21') | 'فروردین' | نام فارسی ماه شمسی را برمیگرداند. |
dl_date_floor('day', '2026-03-21 14:35:00') | '2026-03-21 00:00:00' | تاریخ و زمان را به ابتدای بازه زمانی انتخابی گرد میکند. |
dl_date_floor: آرگومان اول این تابع منحصراً باید یکی از ۸ واحد استاندارد شامل 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute' یا 'second' باشد. استفاده از هر مقدار دیگری با خطای اعتبارسنجی روبهرو میشود.'سهشنبه' و 'پنجشنبه' در خروجی تابع dl_persian_dayname دارای نویسه نیمفاصله (ZWNJ) هستند. در شروط فیلتر کوئری نیز مقایسه باید دقیقاً با رعایت نیمفاصله صورت پذیرد.برای پردازش و استخراج تایپمحور دادهها از مقادیر نیمهساختاریافته JSON در کوئریهای SQL از این توابع استفاده میشود:
| تابع و شیوه استفاده | خروجی | توضیحات |
|---|---|---|
dl_json_text('{"name": "علی"}', '$.name') | 'علی' | مقدار متنی را بدون علامت نقلقول با نوع داده STRING استخراج میکند. |
dl_json_int('{"age": 28}', '$.age') | 28 | مقدار عدد صحیح را با نوع داده BIGINT از مسیر JSON استخراج مینماید. |
dl_json_double('{"price": 1250.50}', '$.price') | 1250.5 | مقدار عدد اعشاری را با نوع داده DOUBLE از مسیر JSON استخراج میکند. |
dl_json_bool('{"is_active": true}', '$.is_active') | 1 (True) | مقدار بولی را با نوع داده BOOLEAN به عدد 1 یا 0 تبدیل میسازد. |
dl_json_pick('{"items": [1, 2]}', '$.items') | '[1, 2]' | زیرمجموعه شیء یا آرایه JSON را بدون تغییر ساختار جهت پردازشهای بعدی استخراج میکند. |
..., LATERAL dl_json_pairs(data) | ردیفهای دو ستونه (key, value) | کلید-مقدارهای سطح بالای شیء JSON را به ردیفهای مجزا تبدیل مینماید. |
dl_json_pairs: این تابع یک Table Function است و باید منحصراً در بند FROM یا JOIN همراه با عبارت LATERAL به کار رود. همچنین از آنجا که کلمه key جزو کلمات رزروشده گرامر SQL است، در بند SELECT یا WHERE باید حتماً درون بکتیک (`key`) قرار گیرد یا با نام مستعار مشخص شود.برای پردازش، فیلتر و مدیریت ساختارهای آرایهای در کوئریهای SQL از این توابع استفاده میشود:
| تابع و شیوه استفاده | خروجی | توضیحات |
|---|---|---|
dl_list_size(['a', 'b', 'c']) | 3 | تعداد اعضای آرایه را برمیگرداند. |
dl_pick(['a', 'b', 'c'], 2) | 'b' | عضو موجود در ایندکس مشخص از آرایه را برمیگرداند (شمارش ایندکسها از عدد ۱ آغاز میشود). |
dl_list_join_text(['red', 'blue'], ', ') | 'red, blue' | اعضای آرایه را با جداکننده مشخص به رشته تبدیل میکند. |
dl_list_dedup(['a', 'b', 'a']) | ['a', 'b'] | اعضای تکراری را از آرایه حذف میکند. |
dl_list_overlap([1, 2], [2, 3]) | 1 (True) | وجود حداقل یک عضو مشترک میان دو آرایه را بررسی مینماید. |
dl_list_apply(x -> x * 2, [1, 2, 3]) | [2, 4, 6] | تابع لامبدا را روی تمام اعضای آرایه اعمال میکند. |
dl_list_keep(x -> x > 10, [5, 12, 20]) | [12, 20] | اعضای آرایه را بر اساس شرط لامبدا فیلتر میکند. |
..., LATERAL dl_explode(tags) | ردیفهای مجزا در ستون unnest | عناصر آرایه را به ردیفهای مجزا تبدیل مینماید. |
dl_collect(status ORDER BY id) | ['pending', 'paid', ...] | مقادیر ردیفهای یک ستون را به صورت یک آرایه تجمیع میکند. |
dl_explode: این تابع به عنوان یک Table Function منحصراً در بخش FROM یا JOIN به همراه عبارت LATERAL به کار میرود و نام ستون خروجی پیشفرض آن unnest است. کاربر میتواند در بند SELECT برای این ستون نام مستعار تعریف نماید.برای تمیزکاری، نرمالسازی و کار با مقادیر متنی در کوئریهای SQL از این توابع استفاده میشود:
| تابع و شیوه استفاده | خروجی | توضیحات |
|---|---|---|
dl_char_swap('۱۲۳', '۰۱۲۳۴۵۶۷۸۹', '0123456789') | '123' | کاراکترها را به صورت نظیربهنظیر جایگزین میکند (مانند تبدیل ارقام فارسی و عربی به انگلیسی یا یکپارچهسازی حروف عربی). |
dl_text_part('ORD-2026-TEH', '-', 2) | '2026' | بخش مشخصی از رشته را بر اساس جداکننده استخراج میکند (شمارش از عدد ۱ آغاز میشود و از اعداد منفی نیز برای شمارش معکوس پشتیبانی مینماید). |
dl_text_title('dadeland warehouse') | 'Dadeland Warehouse' | حروف اول کلمات انگلیسی را بزرگ میکند. |
dl_is_blank('') | 1 (True) | خالی بودن رشته، آرایه یا مقدار NULL را بررسی میکند. |
dl_text_part: با ارسال عدد منفی میتوان قطعات رشته را از انتها استخراج نمود. برای مثال مقدار -1 آخرین بخش و مقدار -2 بخش ماقبل آخر رشته را برمیگرداند.dl_is_blank: این تابع مقادیر NULL یا رشته خالی ('') را تایید میکند، اما رشتههای حاوی فاصله (اسپیس) را خالی تلقی نمیکند و در صورت نیاز باید ابتدا با تابع TRIM پاکسازی شوند.برای استخراج اجزا و پارامترهای مختلف نشانیهای اینترنتی در کوئریهای SQL از این توابع استفاده میشود:
| تابع و شیوه استفاده | خروجی | توضیحات |
|---|---|---|
dl_url_host('https://dadeland.ir/blog') | 'dadeland.ir' | نام هاست و دامنه را از نشانی وب استخراج میکند. |
dl_url_query('https://site.com?utm_source=google', 'utm_source') | 'google' | مقدار پارامتر مشخصی را از Query String استخراج میکند. |
dl_url_part('https://dadeland.ir/docs', 'PROTOCOL') | 'https' | بخش ساختاری مشخصی از نشانی اینترنتی را استخراج مینماید. |
dl_url_part: آرگومان دوم این تابع منحصراً باید یکی از ۸ قطعه استاندارد شامل 'PROTOCOL' (پروتکل ارتباطی)، 'HOST' (نام هاست و دامنه)، 'PATH' (مسیر دسترسی)، 'QUERY' (رشته پارامترها بدون علامت سوال)، 'REF' (برچسب هش بدون علامت شارپ)، 'AUTHORITY' (ترکیب احراز هویت، هاست و پورت)، 'FILE' (ترکیب مسیر و پارامترها) یا 'USERINFO' (اطلاعات کاربری احراز هویت) باشد.