اتصال رشتهها در SQL و روشهای استفاده هوشمند از آن
«زبان ساختارمند پرسشها» (Structured Query Language) یا اصطلاحاً (SQL)، یک ابزار فوقالعاده قدرتمند است که قابلیتهای زیادی را در زمینه ایجاد، تغییر و بازیابی دادهها برای کاربران فراهم میکند. یادگیری و تسلط بر مهمترین دستورات SQL میتواند منجر به ایجاد خلاقیت بیشتر در کار با این زبان شود. یکی از دستورات مهم در این زبان، اتصال رشتهها به یکدیگر یا اصطلاحاً «Concatenation» است. در این مقاله، نکات اساسی مورد نیاز برای به کارگیری این دستور در SQL را به شما آموزش خواهیم داد. گویشهای زیادی برای SQL وجود دارد. در این آموزش، از (PostgreSQL) استفاده خواهد شد.
تعریف اتصال
اتصال در لغت به معنی پیوستن دو چیز به یکدیگر است. احتمالاً دارد که شما نیز از این مفهوم برای ترکیب دو رشته در زبانهای برنامهنویسی استفاده کرده باشید. به عنوان مثال، برای دریافت متغیرهای نام و نام خانوادگی و تشکیل یک نام کامل، باید از این دستور استفاده شود.
اتصال، روش بسیار مفیدی برای ترکیب دو رشته است. برای ایجاد اتصال در زبان PHP، از یک نقطه (.) و در زبانهای جاوااسکریپت و «جیکوئری» (jQuery)، از علامت بعلاوه (+) استفاده میشود. در SQL نیز روند به همین ترتیب است و شما برای تبدیل دو چیز به یک چیز واحد، از عملگر مخصوصی استفاده میکنید. به مثال آورده شده در شبهکد زیر دقت کنید:
first_name = Joe last_name = Coburn whole_name = first_name + last_name
در زبانهای برنامهنویسی، استفاده از اتصال باعث خوانایی بهتر کد میشود. در صورتی که یک کد، همیشه نیاز به دسترسی به دو رشته داشته باشد، ترکیب کردن آنها میتواند باعث یادآوری راحت و کاهش طول آن کد شود.
استفاده از متغیرها در SQL رواج کمتری دارد و به منظور بازگردانی نتایج ترکیب رشتهها یا تغییر دادهها، استفاده از دستور اتصال مورد نیاز است.
ایجاد اتصال
اتصال رشتهها در SQL بسیار آسان است. با اینکه SQL زبان رایجی محسوب میشود، هر موتور پایگاه داده مجزا، ویژگیهای آن را به روشهای متفاوتی پیادهسازی میکند. تمام مثالهای ما در گویش PostgreSQL هستند؛ با این حال، میتوان این مثالها را به راحتی به گویشهای دیگر نیز ترجمه کرد. موتورهای متفاوت میتوانند اصول نحوی متفاوتی برای اعمال دستور اتصال داشته باشند اما اصول اولیه برای همه آنها یکسان خواهد بود.
مثال نام و نام خانوادگی را در نظر بگیرید. در قسمت زیر، کد سادهای با استفاده از دستور «Select» نوشته شده است:
SELECT first_name, last_name, email FROM users_table
تصویر زیر، خروجی کد بالا را نشان میدهد.
هیچ چیز پیچیدهای در اینجا وجود ندارد. اکنون، عملگر اتصال را به این کد اضافه میکنیم:
SELECT first_name || last_name AS full_name, email FROM users_table
همانطور که مشاهده میکنید، این اتصال به خوبی اعمال شده است اما یک مشکل کوچک در آن وجود دارد. در نام کامل، دو بخش نام به یکدیگر چسبیدهاند؛ در صورتی که باید یک فاصله بین آنها وجود داشته باشد. خوشبختانه، حل این مشکل آسان است. تنها باید درون کد یک فاصله بین دو نام اضافه کنیم:
SELECT first_name || ' ' || last_name AS full_name, email FROM users_table
کدهای ارائه شده در بالا، یک سری مثال ابتدایی هستند. نحوه عملکرد دستور اتصال به این صورت است که دو بار از عملگر «|» در بین عبارتهای مورد نظر استفاده میشود. موتور SQL میداند که باید هر بخش در قبل و بعد از این عمگر را به یکدیگر متصل کرده و با آنها به عنوان یک جز واحد برخورد کند. عملگر اتصال باید با احتیاط به کار گرفته شود؛ زیرا اگر از این عملگر استفاده کنید اما چیزی برای متصل شدن وجود نداشته باشد، با یک پیغام خطا مانند تصویر زیر مواجه خواهید شد.
همانطور که پیشتر نیز به آن اشاره شد، در این مثالها از گویش PostgreSQL استفاده شده است. گویشهای دیگر میتوانند از عملگر متفاوت یا حتی تابع خاصی برای فراخوانی اتصال استفاده کنند. در واقع، هیچ اهمیتی ندارد که شما چگونه رشتهها را به هم متصل میکنید. تنها باید این کار را مطابق با موتور پایگاه داده خود انجام دهید.
مسائل پیچیدهتر
اکنون که با مبانی کاربرد اتصال در SQL آشنا شدید، مثالهای جزئیتر به همراه اشتباهات رایج در آنها را مورد بررسی قرار میدهیم. اکثر موتورهای پایگاه داده، ترکیبی از رشتهها، اعداد صحیح و حتی تاریخها را به خوبی به هم متصل میکنند.
در فرآیند اتصال، معمولاً زمانی با مشکل مواجه خواهید شد که قصد ترکیب کردن موارد پیچیدهای مانند آرایهها را داشته باشید.
SELECT first_name || ' ' || last_name || ARRAY[123, 456] AS full_name, email FROM users_table
کد بالا به درستی عمل نخواهد کرد؛ زیرا امکان ترکیب رشته با اشیا پیچیدهای مانند آرایهها وجود ندارد. اگر به درستی راجع به کاری که میخواهید انجام دهید فکر کنید، اغلب میتوانید به جای استفاده از کدهای پیچیده و غیر قابل اجرا، کارهای مد نظر خود را با نوشتن کدهای ساده انجام دهید.
در صورتی که با دقت در مورد کار مورد نیاز خود فکر کنید و نتوانید از SQL برای انجام آن بهره ببرید، شاید گزینه بهتر، استفاده از زبانهای برنامهنویسی دیگر باشد. اشکالزدایی یک کد SQL که منطق ریاضی زیادی در آن به کار رفته است، بسیار دشوار خواهد بود. اگر قصد استفاده از منطق در SQL را دارید، بهتر است به یک زبان برنامهنویسی دیگر روی بیاورید.
اتصال، برای دستورات «where» نیز به خوبی عمل میکند:
SELECT first_name, last_name, email FROM users_table WHERE date_of_birth = ('DAY' || '/' || 'MONTH' || '/' || 'YEAR')::date
در این مثال، «DAY» (روز)، «MONTH» (ماه) و «YEAR» (سال) پارامترهایی هستند که به صورت یک کد وارد شدهاند. اطلاعات ورودی را میتوان توسط یک کد یا یک کاربر ایجاد کرد. پس از اجرای دستورات بالا، بخشهای مختلف به هم متصل میشوند و با استفاده از اصول نحوی تاریخ در PostgreSQL، یعنی «date::»، در قالب یک تاریخ به نمایش درمیآیند.
به کارگیری اتصال به این شکل، امکان کنار هم گذاشتن اجزا یک تاریخ را برای شما فراهم میکند که بعداً میتواند به عنوان یک تاریخ واقعی مورد پردازش قرار گیرد (برخلاف یک رشته). فراموش نکنید که این مثال ابتدایی، در مقابل تزریق SQL یا همان «Injection» محافظت نمیشود. از اینرو، نباید آن را در هر «کد تولید» (Production Code) و بدون ایجاد اصلاح و تغییرات، مورد استفاده قرار داد.
مشکل دیگری که باید در بحث اتصال به آن توجه داشته باشید، مسئله مقادیر تهی یا «Null» است. یک رشته هنگامی تهی است که خالی یا غیر موجود باشد. دستورات زیر را در نظر بگیرید:
SELECT first_name || ' ' || NULL AS full_name, email FROM users_table
اجرای این کد با مشکل مواجه خواهد شد. دلیل این امر، نحوه کدنویسی اتصال در موتور پایگاه داده است. شاید همیشه با این مشکل مواجه نشوید اما این مسئله تقریباً رایج است. اگر فکر میکنید که نتیجه دستورات شما به صورت تهی بازگردانده میشود، باید از دستور «coalesce» استفاده کنید. این دستور را تقریباً میتوان به این صورت در نظر گرفت: اگر این بخش تهی است، رشته یا ستون دیگر را جایگزین آن کن.
SELECT first_name || ' ' || COALESCE(NULL, 'ERROR NULL DATA') AS full_name, email FROM users_table
#