سؤال

قرأت عن استخدام تعبير CASE داخل جملة WHERE هنا:

http://scottelkin.com/sql/using-a-case-statement-in-a-sql-where-clause/

أحاول استخدام هذا لتصفية النتائج من بيان التحديد الخاص بي، استنادًا إلى رقم العقد الذي سيتم تمريره بواسطة تطبيق المستخدم.يُظهر الكود الخاص بي حاليًا خطأ "معلمة غير صالحة" بغض النظر عما تم تمريره.لقد تحققت من أن SELECT/FROM تعمل بشكل جيد، كما هو الحال في عبارة WHERE بدون تعبير CASE.هنا هو الكود الخاص بي.

WHERE     (CASE WHEN @ContractNo = 0 THEN @ContractNo ELSE @ContractNo END =
tblContracts.ContractNo)

إن تكرار التعليمات البرمجية هو لأغراض استكشاف الأخطاء وإصلاحها، وأخطط لاستخدام تصفية أحرف البدل في الحالة لاحقًا.أنا أركز على الحصول على بناء الجملة في الوقت الحالي.أعتقد أن هذا يجب أن يُرجع جميع السجلات التي تتطابق المعلمة الخاصة بها مع رقم العقد المخزن في الجدول.أي مساعدة أو مشورة موضع تقدير كبير.

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

المحلول

بعد قراءة شرحك، هناك طريقة أفضل للقيام بذلك بدونها CASE:

WHERE @ContractNo = 0 OR tblContracts.ContractNo = @ContractNo

سيؤدي هذا إلى إرجاع أرقام العقود المطابقة فقط، ما لم @ContractNo هو 0، وفي هذه الحالة فإنه سيتم إرجاع كافة السجلات.

يحرر: لقد لاحظت ذلك للتو اقترح CasperOne نفس الشيء.لم أرى ذلك.كبر نفسك.

نصائح أخرى

هل أنت متأكد أنك تريد أن تفعل هذا؟ بيان قضيتك دوما بإرجاع @ContractNo. أعتقد أن ما كنت تبحث عن هذا:

where 
    case @ContractNo 
        when 0 then tblContracts.ContractNo 
        else @ContractNo 
    end = tblContracts.ContractNo

ومرشح فوق يقول "أعطني العقد حيث يساوي ContractNo المعلمة، أو كل منهما إذا كانت المعلمة هي 0.

والمرشح السابق تصفيتها إلا إذا كان حقل رقم العقد يساوي بالضبط إلى المعلمة.

وبغض النظر، يجب عليك القيام بذلك بدلا من ذلك:

where @ContractNo = 0 or @ContractNo = tblContracts.ContractNo

والمنطق هو أسهل بكثير لفهم، وعلى رأس ذلك (لا اقتبس لي على هذا)، ومحسن من المحتمل أن تعمل بشكل أفضل خارج بيان القضية.

وحاول تاركة الأقواس التي هي في المكان الخطأ على أي حال - يجب أن يكون لأحد الحق بعد "END"

وربما كنت قد نسيت أن يعلنContractNo؟ هو مشابه ل0 وtblContracts.ContractNo؟

وظيفة العودية في حل قضية بلدي على وجه التحديد.

ورأيت شكاوى حول وضوح منصبي الأصلي. في المستقبل، ما الذي يمكنني القيام به لجعل ما أقوله أكثر على التوالي إلى الأمام؟ أنا لا تستخدم لصياغة أسئلة حول الرمز، ونعتذر عن أي أشياء مشوشة كان. هل أنا فقط بحاجة إلى تقديم تفاصيل موسعة مثل في منصبي 2ND؟

وشكرا مرة أخرى على كل المساعدة.

انقل القوس المغلق إلى ما قبل = مثل ذلك:

WHERE     (CASE WHEN @ContractNo = 0 THEN @ContractNo ELSE @ContractNo END)=tblContracts.ContractNo

لا أستطيع أن أرى ما سيفعله بيان الحالة هذا بالرغم من ذلك ...أنت تعيد نفس الشيء في حالة @ContractNo = 0 أو إذا لم يكن كذلك...

بناء الجملة الصحيح هو:

  Select...
  ...
  Where(
    Case
      When <Condition>
        Then <Return if true>
        Else <Return if false>
      End
 ) = <Whatever is being matched to the output of the case statement>

بغض النظر عن بناء الجملة، فإن المثال الخاص بك ليس له معنى كبير، إذا كنت تبحث عن جميع العناصر المطابقة أو التي تحتوي على رقم العقد 0، فستفعل:

Select...
...
Where (
  @ContractNo = 0 Or
  @ContractNo = tblContracts.ContractNo
)

والذي يبدو منطقيًا أكثر بكثير مما تحاول استخدام بيان الحالة من أجله.

يحرر: لا بد أنني أخطأت في قراءة السؤال قليلاً - عادةً ما تعني المعلمة المفقودة أن المعلمة (في هذه الحالة @ContractNo) لم يتم الإعلان عنها في نطاق الاستعلام/الإجراء الخاص بك.لكن أحدهم أشار إلى ذلك بالفعل، لذلك لا أستطيع أن أنسب أي الفضل في ذلك.

والسبب لبيان الحالة، بما في ذلك كله "اذا كان 0، وإعطاء المعلمة، وخلاف ذلك، مجرد اعطاء المعلمة" كان لاختباره في محاولة للحصول على حق بناء الجملة. في الأصل، كنت قد حاولت قائلا "اذا كان 0، ثم تمر في '٪'، للعودة كل قيمة. كود نشرت لي في كان هناك لأنني أبقى الحصول على" معلمة غير صالحة "وأحسب يجب أن يكون هناك شيء خاطئ مع تركيب بلدي، وعندما I فصلها إلى مطابقة المعلمة الأساسية مثل ذلك،

WHERE @ContractNo = tblContracts.ContractNo

وعادت سجلات دقيقة. اسمحوا لي أن أشرح أكثر قليلا.

وأنا سحب من مجموعة من جداول مختلفة، وتصفية المحتوى بمعلومات غير المدرجة في العبارة حدد (أي tblContracts هو عدم وجود معلومات سحبت منه عن طريق الاختيار، انها تستخدم فقط في أين). سيكون المستخدم الاختيار من مربع التحرير والسرد التي سيكون لها أرقام العقود المختلفة، فضلا عن القيمة الافتراضية من "الكل".

وأنا ذاهب ليكون حدثا لحين ارتفع مؤشر التغييرات مربع التحرير والسرد. لو كان "الكل"، سيتم تمرير 0 في كمعلمة وأنا لا نريد تصفية القيام به. خلاف ذلك، أريد فقط المعلومات لهذا العدد العقد (سببContractNo شيء آخر).

ولا يعني شيئا مثل هذا؟

SELECT * 
    FROM tblContracts
    WHERE     
    CASE 
       WHEN tblContracts.ContractNo = 0 THEN @ContractNo 
       ELSE tblContracts.ContractNo
    END = tblContracts.ContractNo

وأينContractNo هو متغير من نفس نوع البيانات كما tblContracts.ContractNo

وماذا تحتاج حتى بيان الحالة؟

عندContractNo = 0 ثم (0 = tblContracts.ContractNo) آخرContractNo ثم (ContractNo = tblContracts.ContractNo)

وهذا لا معنى لأنك يمكن ببساطة أكتب هذا ك

وأينcontractNo = tblContracts.contractNo

هل عدد العقد في الواقع رقمية أو أنها ليست السلسلة التي يحدث دائما أن تكون رقمية. تحقق أنواع البيانات بين الجدول والمعلمة وبيان حالة (على سبيل المثال، "= 0" أو "=" 0 ")

وبناء الجملة هذا يجب أن تعمل (هو الحال في أوراكل)

WHERE CASE WHEN tblContracts.ContractNo = 0 
           THEN @ContractNo 
           ELSE tblContracts.ContractNo
      END = tblContracts.ContractNo

وعندما تقول:

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

وأنا سحب من مجموعة من جداول مختلفة، وتصفية المحتوى بمعلومات غير المدرجة في العبارة حدد (أي tblContracts هو عدم وجود معلومات سحبت منه عن طريق الاختيار، انها تستخدم فقط في أين). سيكون المستخدم الاختيار من مربع التحرير والسرد التي سيكون لها أرقام العقود المختلفة، فضلا عن القيمة الافتراضية من "الكل".

وبعد ذلك يبدو لي أنه ينبغي أن يكون لها "أين يوجد" شرط. منذ الخاص بك لا سحب أي معلومات من هذا الجدول؟!

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