سؤال

في الخلية، إذا كانت الوسيطة الأولى من وظيفة IF () هي سلسلة، فلماذا العودة كاذبة؟

SELECT IF('string', 'string', 'not string'); -- 'not string'

وبالطبع يمكنني أن نوعا من إصلاح هذا إذا فعلت

IF(!ISNULL('string'), 'string', 'not string')) -- 'string'

أو

IFNULL('string', 'not string'); -- 'string'

ويبدو إلى حد ما غير بديهية أن يقيم سلسلة الطريقة التي لا كما نرى

SELECT IF(1, 'one', 'not one'); -- 'one'

و

SELECT IF('1', 'one', 'not one'); -- 'one'

وتقييم الطريقة التي يقومون بها ...

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

المحلول

الخلية

<اقتباس فقرة>   

وIF (expr1، expr2، expr3)

     عودة

إذا expr1 غير الحقيقي (expr1 <> 0 وexpr1 <> NULL) ثم IF ()   expr2. وإلا فإنها ترجع expr3.   IF () بإرجاع رقمية أو سلسلة   قيمة، وهذا يتوقف على السياق   الذي يتم استخدامه.

وحتى 1 غير صحيح لأن 1! = 0 و 1! = NULL. هذا هو مثل ما كنت انظر في C.

ولكن لسلسلة قائلا ان 'اختبار' تقييم إلى true ليس له أساس حقيقي في تعريف ولا معنى منطقي. لا بد من مقارنة شيء للحصول على نتيجة منطقية.

نصائح أخرى

الوسيطة الأولى نظرا لIF() هو المسند . لا يعتبر سلسلة المسند من قبل الخلية، لذلك فإنه افتراضات إلى false. كما في الحالة الخاصة بك الماضي، والكثير من اللغات (C، بيرل، الخ) النظر في الأعداد الصحيحة غير صفرية صحيح، لذلك الخلية هو مجرد دعم هذا النموذج.

ولأن 'سلسلة' ليست صحيحة ولا خاطئة والتعبير الأول يجب تقييم إلى منطقية.

وماذا IF (1، ...) تقييم إلى true؟ سؤال جيد. ربما ردة إلى C (أي لو كان 1، ثم هذا صحيح)؟

وتحرير: في الواقع، من خلال تعريف الأمر على http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if ، expr1 هو TRUE إذا expr1 <> 0 وexpr1 <> NULL، كما هو الحال عندما expr1 == 1.

لاحظ أن هناك تشابه في PHP:

"string" != 0 // false
"one"    != 0 // false
"1"      != 0 // true

ويبدو أن الارتباك أن تنشأ بسبب الخلية يقارن إلى 0 (وباطلا) للحصول على قيمة منطقية لشيء ما. في لغات أخرى، مثل PHP وجافا سكريبت، سلسلة، عندما يلقي على منطقية، يعود صحيحا عندما غير فارغة (أو لا "0").

// php
0 == true          // false
"string" == 0      // true*
"string" == true   // true

// mysql
if(0, "true", "false")   // false
if("string", "true", "false") // false*

وخطوط *starred* اثنين تظهر مقارنات مماثلة، إذا كنت تعرف ما أعنيه.

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