PDA

View Full Version : گذاشتن شرط برای مقدار یک ستون در دستور SELECT قبل از FROM



reza_edu
چهارشنبه 21 اردیبهشت 1390, 00:14 صبح
با راهنمائی که جناب علی دانشمندی کردن متوجه شدم که میشه در دستور SELECT میشه قبل از FROM برای ستون شرط گذاشت مثل مثال زیر :

SELECT
CASE ISNull(DateColumnName,0)
WHEN ISNull(Null,0) THEN Null
ELSE dbo.ToPersianDate(DateColumnName)
END FROM Table_Name



حالا یه سوال برام پیش اومده چه جوری میشه همچین دستور سلکتی نوشت؟

این اصلیه هست

SELECT CodeEM,FrirstName FROM Table1


میخوام اینجوری بشه! میشه؟


SELECT IF BEGIN COUNT(CodeEM)>0 THEN BREAKE ELSE SELECT CodeEM,FrirstName FROM Table1 END



معنی دستور به فارسی : انتخاب کنه سطر رو اگه قبلا این کد انتخاب شده بود بره سطر بعدی در غیر این صورت نمایش بده سطر رو؟
میشه نوشتش؟فارسی که شد:بامزه:

Reza_Yarahmadi
چهارشنبه 21 اردیبهشت 1390, 18:16 عصر
انتخاب کنه سطر رو اگه قبلا این کد انتخاب شده بود بره سطر بعدی در غیر این صورت نمایش بده سطر رو؟
ما که فارسیش رو متوجه نشدیم!!:گیج:
منظورتون از اینکه کد قبلا انتخاب شده باشه چیه؟ کجا انتخاب شده باشه؟ ...؟ ساختار جدول (ها) و چند سطر نمونه رو بذارید تا بهتر بشه کمکتون کرد.
حدس من اینه که شما میخواید کدهای یک جدول رو با جدول دیگه مقایسه کنید و در صورتی که کدی از جدول اول توی جدول دوم استفاده نشده بود اون سطر رو نمایش بده. برای این موضوع میشه بصورت زیر عمل کرد
Select *
From Table1
Where
CodeEM NOT IN (Select CodeEM From Table2)

حمیدرضاصادقیان
پنج شنبه 22 اردیبهشت 1390, 09:14 صبح
سلام.
شما اگر نوع ترتیب اجرا شدن اطلاعات رو بدونید به راحتی میتوانید دستور مورد نظرتون رو اجرا کنید.
ببینید در دستورات SQL Server اولین دستوری که پردازش میشه عبارت From هست. دومین عبارتی که پردازش میشه شرط Where هست. سومین عبارت Group By هست. چهارمین عبارت Having هست.
پنچمین عبارت عبارت Select هست. آخرین عبارت Order By هست.

با این اوصاف شما نیازی ندارید شرط رو داخل خود Select بنویسید. چون تمام پردازش ها روی اطلاعات انجام میگیره و فیلترینگ کامل صورت میگیره و در Select فقط فیلدهای مورد نظر نمایش داده میشه.

نکته ای که باید در پردازش ها بهش توجه کرد این هست که در عبارت From اول Cross join بعد inner join بعد outer Join بررسی می شود. و همیشه از جدول سمت چپ به سمت راست پردازش انجام میشود.
نکته دیگر اینکه فقط در Outer Join ابتدا شرط On قبل از اینکه جدول خارجی مقادیرش اعمال بشه ، اجرا میشه بعد جدول خارجی با جدول سمت چپ خودش Join خواهد شد که ممکنه بعضی مواقع رکوردهای متناظر نباشه و مقدار null برگردونه.
شرط Where روی نتیجه بدست آمده از عبارت From اجرا میشه. بعد از اون Group By روی اطلاعات بدست آمده از Where عمل گروه بندی رو انجام میده. بعد Having روی نتیجه بدست آمده از Group by صورت میگیره. در نهایت فیلدهای قید شده در دستور Select نتیجه رو از نتیجه نهایی بدست آمده از اعمال Having به شما نمایش خواهد داد. بعد Order By روی این نتیجه اعمال خواهد شد.
برای هر مرحله پردازش نیز یک جدول مجازی داخل خود SQL Server ایجاد میشود که ما به اون دسترسی نداریم.

این کل مراحل پردازش یک عبارت Select هست.حالا شما خودت دستور مورد نظرت رو بررسی کن ببین کجا باید اون شرط اعمال بشه با توجه به توضیحاتی که دادم.

reza_edu
شنبه 24 اردیبهشت 1390, 10:13 صبح
واقعا ممنون عالی بود چون من از هیچکدوم موارد اطلاعی نداشتم {میدونم کارم درست نیست و باید بیشتر بخونم } خیلی ممنون که لطف کردید و گفتید . یه سوال داشتم من view نوشتم که حاصل جمع چند جدول هست در جدول اصلی یک کلید اصلی دارم که در جداول دیگر کلید خارجی هست . تو جدول اصلی برای هر کارمند یک رکورد ذخیره میشه و ممکنه در جدول دیگر 50 یا بیشتر رکورد ذخیره بشه مثل مثال زیر :
-----------------------------
جدول کارمند :
کد کارمند - نام کارمند
201 - رضا
///////////////////////////
جدول ورود خروج
کد زمان ورود - کد کارمند - تاریخ - زمان ورود - زمان خروج
1 -201 -1389/01/02 -8:30 - 23:15
2 - 201 - 1389/01/03 - 9:00 - 23:00

حالا این جدول نمونه ذکر شده زمانیکه یه view از این جداول تهیه بشه میشه یه کد کارمندی با نام که برای تاریخ های مختلف تکرار شده من باتوجه به روش گفته شده در این تاپیک http://barnamenevis.org/showthread.php?286133-%D8%A7%D9%84%D8%AD%D8%A7%D9%82-%D8%B3%D8%B7%D8%B1%D9%87%D8%A7%DB%8C-%D8%AC%D8%AF%D9%88%D9%84-(Concatenating-Rows)-%D8%A8%D9%87-%DA%86%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88-%DA%A9%D9%86%D9%85%D8%9F تونستم همه این تاریخ ها رو تو یه رکورد با کد و نام کارمند نشون بدم اما با این روش نمیشه شرط گذاشت که مثلا کارمندی رو نشون بده که روز 1389/01/02 ساعت 5 شرکت بوده یانه حالا میخوام روشی رو به کار به برم که بشه این مشکل من رو حل کنه :
روش من {اونیکه به ذهنم رسید :
دوتا view درست کنم یکی استاندارد شده و دیگری غیر استاندارد تو غیر استاندارد{همونیکه نام و کد کارمند رو مثلا 100 بار تکراری نشون میده} جستجو کنم و نتیجه اون کد های کارمندی که از این جستجو برگشته رو با یه شرتی join کنم با جدول استاندارد حالا من موندم که چه جوری دستورش رو بنویسم؟ اگه ممکنه کمک کنید .
اینکه میخواستم شرط بزارم برای این بود که بتونم کاری کنم که تو جدول غیر استاندارد حاصل جستجو برای هر کارمند اگر 10 کد کارمندی تکراری هم بود فقط یک کد کارمندی برای من برگردونه تا من بتونم اون کد کارمندی رو با کد کارمندی جدول استاندارد join کنم

اگه بازم دیدید توضیحاتم ناقص هست لطفا بفرمائید تا بیشتر توضیح بدم با تشکر از راهنمائی شما.