Metabase

Coalesce

تابع coalesce مقدارها را به‌ترتیب بررسی می‌کند و اولین مقدار غیرتهی (non-null) را برمی‌گرداند.

این تابع زمانی مفید است که می‌خواهید:

SyntaxExample
coalesce(value1, value2, …)coalesce("null", "null", "bananas", "null" …)
برمی‌گرداند: اولین مقدار غیر-null از بین یک لیست مقادیر“bananas”

پر کردن مقادیر خالی یا Null (Filling in empty or null values)

left_table_colright_table_colcoalesce([right_table_col], 0)
111
2null0
3null0
444

ممکن است بخواهید مقادیر null را پر کنید اگر:

  • داده‌ها تنک (Sparse) هستند،
  • یا nullها در نتیجهٔ یک left join ایجاد شده‌اند (مثل مثال بالا).

برای مثالِ کامل‌تر، بخش Filling in data for missing report dates را ببینید.

تجمیع مقادیر از چند ستون (Consolidating values from different columns)

NotesCommentscoalesce([Notes], [Comments], "No notes or comments.")
I have a note.I have a comment.I have a note.
I have a comment.I have a comment.
I have a note.I have a note.
No notes or comments.

محاسبه روی ستون‌های مختلف (Creating calculations across different columns)

SubtotalDiscountcoalesce([Subtotal], 0) - coalesce([Discount], 0)
10.000.159.85
21.0021.00
16.001.6014.40
4.004.00

در متابیس، اگر در یک محاسبه یکی از ستون‌ها null باشد، نتیجه هم null می‌شود. دلیلش این است که null نمایندهٔ «نامشخص» یا «ناموجود» است، نه لزوماً صفر؛ یعنی ۱ + "unknown" = "unknown".

اگر می‌خواهید «نامشخص» را به‌معنای صفر (یا هر مقدار دیگری که در دامنهٔ شما معادل «هیچ» است) در نظر بگیرید، بهتر است ستون‌هایی را که در محاسبات استفاده می‌کنید با coalesce بپیچید.

انواع دادهٔ پذیرفته‌شده

Data typeسازگار با coalesce
String
Number
Timestamp
Boolean
JSON

محدودیت‌ها

در یک فراخوانی coalesce بهتر است همهٔ مقادیر از یک نوع داده باشند. اگر می‌خواهید بین نوع‌های مختلف coalesce انجام دهید:

  • در SQL از CAST استفاده کنید.
  • یا نوع داده را از صفحهٔ Table Metadata تغییر دهید: تغییر نوع داده.

اگر می‌خواهید روی JSON یا JSONB از coalesce استفاده کنید، ابتدا باید JSON را به سطح ستون‌های ساده «باز» کنید. برای این کار باید از توابع JSON مربوط به dialect دیتابیس خودتان استفاده کنید. چند راهنمای مرجع SQL در انتهای صفحه آمده است.

توابع مرتبط

این بخش توابع و الگوهایی را نشان می‌دهد که می‌توانید به‌جای coalesce (یا در کنار آن) استفاده کنید:

تعبیرهای متابیس

ابزارهای دیگر

در مثال‌ها از همان دادهٔ نمونهٔ بخش تجمیع مقادیر استفاده می‌کنیم:

NotesCommentscoalesce([Notes], [Comments], "No notes or comments.")
I have a note.I have a comment.I have a note.
I have a comment.I have a comment.
I have a note.I have a note.
No notes or comments.

Case

تابع case در متابیس:

case(ISBLANK([Notes]) = FALSE AND ISBLANK([Comments]) = FALSE, [Notes],
     ISBLANK([Notes]) = TRUE  AND ISBLANK([Comments]) = FALSE, [Comments],
     ISBLANK([Notes]) = FALSE AND ISBLANK([Comments]) = TRUE,  [Notes],
     ISBLANK([Notes]) = TRUE  AND ISBLANK([Comments]) = TRUE,  "No notes or comments")

معادل این عبارت با coalesce است:

coalesce([Notes], [Comments], "No notes or comments.")

نوشتن coalesce معمولاً خیلی ساده‌تر است، به‌شرطی که در حالتی که هر دو ستون مقدار داشته باشند، اولین مقدار برای شما کافی باشد. اگر می‌خواهید در این حالت خروجیِ خاصی داشته باشید (مثلاً «I have a note and a comment»)، بهتر است از case استفاده کنید.

SQL

در اغلب موارد، سؤال‌هایی که از notebook editor ساخته می‌شوند به SQL تبدیل و روی دیتابیس اجرا می‌شوند.

تابع coalesce در SQL:

SELECT
    COALESCE(notes, comments, 'No notes or comments.')
FROM
    sample_table;

معادل این عبارت در متابیس است:

coalesce([Notes], [Comments], "No notes or comments.")

Spreadsheets

اگر جدول Notes و Comments در یک Spreadsheet باشد و ستون "Notes" در ستون A و "Comments" در ستون B باشد، می‌توانید از فرمول زیر استفاده کنید:

=IF(ISBLANK($A2), $B2, IF(ISBLANK($B2), $A2, "No notes or comments."))

که معادل این عبارت در متابیس است:

coalesce([Notes], [Comments], "No notes or comments.")

در Spreadsheetها ممکن است برای «coalesce کردن» مقادیر روی سه ستون یا بیشتر از ترکیب INDEX و MATCH در فرمول‌های Array استفاده کنید.

Python

اگر جدول Notes و Comments در یک DataFrame پانداس به نام df ذخیره شده باشد، ترکیب توابع combine_first() و fillna():

df["custom_column"] = df["notes"].combine_first(df["comments"])\
                                 .fillna("No notes or comments.")

معادل این عبارت در متابیس است:

coalesce([Notes], [Comments], "No notes or comments.")

مطالعهٔ بیشتر