سؤال

لقد كنت أعمل على تحسين الاستعلام وواجهت موقفًا جعلني أتساءل عن كيفية استخدام عامل التشغيل OR الخاص بـ SQL دائمًا.(SQL Server 2000 أيضًا)

لدي استعلام حيث تبدو الجملة الشرطية (WHERE) كما يلي:

WHERE (Column1 = @Param1 or Column1 LIKE @Param1 + '%')
AND (@Param2 = '' OR Column2 = @Param2 OR Column2 LIKE @Param2 + '%')

الآن، لقد فهمت دائمًا أن OR في SQL قام بتقييم كلا التعبيرين.لذا، سيتم إرجاع كافة السجلات التي تم تقييمها على أنها صحيحة للتعبير الأيسر مع كافة السجلات التي تم تقييمها على أنها صحيحة في التعبير الأيمن.على سبيل المثال:

SELECT * FROM TABLE1
WHERE COL1 = 'Test' OR Col2 = 'Data'

سيؤدي هذا إلى إرجاع كافة السجلات حيث يكون COL1 هو "اختبار" بالإضافة إلى أي سجل حيث يكون Col2 هو "بيانات".

في المثال أعلاه، قمت بتعديل Column2 الشرطي إلى ما يلي:

AND(Column2 LIKE ISNULL(@Param2, '') + '%')

فجأة، تم إرجاع 0 صفوف.

هل كنت مخطئًا في ذلك أم تقوم بتقييم التعبيرات فقط حتى تجد نتيجة صحيحة أم أن هناك شرطًا من شأنه أن يتسبب في إرجاع 2 مختلفين لنتائج مختلفة؟

هل كانت مفيدة؟

المحلول

و"OR فقط يقيم امتحان تعبيرات حتى تجد النتيجة الحقيقية"

ولديها فقط، ولكن هذا ليس مشكلتك (في الواقع هذا هو ما يوفر لك في حالة الأصلي). لديك اثنين الاستعلامات لا تعادل حقا.

وأنا أفكر لديك NULLs في COLUMN2 الذي يؤدي أبدا (Column2 LIKE ISNULL(@Param2, '') + '%') ليكون صحيحا - وفي الإصدار الأصلي من @Param2 = '' تم اخفاء هذه الحالة، لأنه هو الصحيح (في بعض الأحيان)

وربما:

(ISNULL(Column2, '') LIKE ISNULL(@Param2, '') + '%')

وتذكر منطق ثلاثي لبالقيم الفارغة:

TRUE and UNKNOWN: UNKNOWN
TRUE or UNKNOWN: TRUE

FALSE and UNKNOWN: FALSE
FALSE or UNKNOWN: UNKNOWN

ولكن لست متأكدا من التحسين وتساعد حقا.

نصائح أخرى

وأو لا يشمل الجميع، خاصة وانها بين قوسين. ما لديك في أكبر منذ هو: WHERE X AND Y. أن حقيقة أن X و Y هم أنفسهم التعبيرات المنطقية التي تجعل استخدام وسيلة أو غير مهم: يتم تقييمها بشكل منفصل ومن ثم يتم تغذية النتائج إلى والمشغل

[تحرير]:
القراءة مرة أخرى، ربما أكون قد يساء فهمها سؤالك. مع أخذ ذلك في الاعتبار، وأنا يجب أن أذهب مع الجواب الأخرى، لأن NULL LIKE '%' يعود NULL، وهو نفس كاذبة في هذه الحالة. قد حاول هذا بدلا من ذلك:

COALESCE(Column2,'') LIKE COALESCE(@param2,'') + '%'

لمعلوماتك، هناك تجارب بسيطة للغاية يمكنك القيام بها للتأكد من أنه ليس من الضروري تقييم جميع الحالات.

لقد فعلت ذلك في Oracle ولكني أتوقع أن تحصل على نتيجة مماثلة في SQL Server.

dev> select * from dual where 1=1 or 1/0 = 3;

D
-
X

يجب ألا يتم تقييم الشرط بعد OR، لأنه سيؤدي إلى ظهور خطأ قسمة على صفر.

يُعرف هذا التعامل مع العوامل المنطقية عمومًا باسم "الدائرة القصيرة"، ويعتبر AFAIK أمرًا قياسيًا في اللغات الحديثة.يمكن تطبيقه أيضًا في تعبير AND - إذا كان الشرط الأول خاطئًا، فلا فائدة من تقييم الشرط الثاني، نظرًا لأن التعبير بأكمله لا يمكن أن يكون صحيحًا.

مزيد من المعلومات: http://en.wikipedia.org/wiki/Short-circuit_evaluation

على أي حال، كما قال كيد، ربما تكون مشكلتك الحقيقية هي سوء التعامل مع القيم الخالية.

وMS-SQL وتقييم الجانب الأيسر أولا وليس المضي قدما إلا أنه يحتاج إلى.

وهذا هو نفسه مع والموصل، وسيتم تقييم الجانب الأيسر وإذا كاذبة لن evaulated الحق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top