يعرف الكثير من الناس الدالة المضمنة ISNULL (X، Y) ويستخدمونها ، والتي تستبدل الوسيطة الأولى بالوسيطة الثانية إذا كانت (أولاً) NULL. الأقل استخدامًا هو الدالة العكسية المضمنة NULLIF (X، Y) ، والتي تُرجع NULL إذا كانت الوسيطة الأولى تساوي الثانية. يتجنب الجمع بين هاتين الوظيفتين استخدام IF-ELSE أو CASE-WHEN ، مما يجعل الكود أكثر إحكاما. إذا كنت مهتمًا برؤية مثالين ، فمرحباً بك في القط.
على سبيل المثال ، هنا رمز ينتج 10 أعداد صحيحة عشوائية في النطاق من 1 إلى 37 ، وأقرب قيمة تساوي أو أكبر من الرقم المعروض هو مضاعف 6.
SELECT Q.Src, CASE WHEN Q.Src % 6 = 0 THEN Q.Src ELSE Q.Src + (6 - Q.Src % 6) END AS NextTimes6 FROM ( SELECT TOP 10 CONVERT(INT, 1 + 37 * RAND(CHECKSUM(NEWID()))) Src FROM SYSOBJECTS S ) Q
يمكنك التخلص من CASE .. عند القيام بالحيلة التالية - تحويل NULL إلى نتيجة Q.Src٪ 6 إذا كان الباقي يساوي 0 ، مع العلم أن نتيجة أي عملية باستخدام NULL هي NULL ، ثم استعادة NULL إلى 0 مع وظيفة خارجية ISNULL:
SELECT Q.Src, Q.Src + ISNULL(6 - NULLIF(Q.Src % 6, 0), 0) AS NextTimes6 FROM ( SELECT TOP 10 CONVERT(INT, 1 + 37 * RAND(CHECKSUM(NEWID()))) Src FROM SYSOBJECTS S ) Q
مثال آخر هو تقسيم سلسلة إلى جزأين بمسافة (على سبيل المثال ، اسم من سلسلة اسم <space> اللقب. مشكلة نموذجية هنا عند حل "head on" هي وظيفة LEFT عند تعطلها بحجة -1 كقيمة عدد الأحرف المراد قطعها في حالة عندما لا توجد مساحة في سطر المصدر (ترجع CHARINDEX 0):
SELECT Q.Src, CASE WHEN CHARINDEX(' ', Q.Src) > 0 THEN LEFT(Q.Src, CHARINDEX(' ', Q.Src) - 1) ELSE Q.Src END AS NameOnly FROM ( SELECT N' ' AS Src UNION ALL SELECT N'' ) Q
يتحول إلى:
SELECT Q.Src, LEFT(Q.Src, ISNULL(NULLIF(CHARINDEX(' ', Q.Src), 0) - 1, LEN(Q.Src))) AS NameOnly FROM ( SELECT N' ' AS Src UNION ALL SELECT N'' ) Q
استمتع ببرمجة SQL!