سؤال

هل هناك طريقة لإعادة كتابة عبارة SQL Transact التي تستخدم حالة عندما تكون الهيكل لنفس الشيء دون استخدام القضية متى؟

أنا أستخدم منتج يحتوي على مصمم استعلام مدمج و SQL PSEDO-SQL الخاص به. لديها قيود على ما يمكنني استخدامه مع SQL Server وأوراكل. لذلك لدي هذا العمود، عندما تكون قاعدة البيانات الأساسية هي Oracle، تستخدم فك التشفير (وهو مدعوم). ومع ذلك، أحتاج إلى جعله يعمل مع SQL Server وقضية غير مدعومة.

البيان أحاول التحويل هو شيء مثل

Decode (StatusColumn,  'Value 1',
Decode(Sign(Now()-TargetDateColumn)),1,'Past
Due', 'Outstanding'),  'Value 2',
Decode(Sign(Now()-TargetDateColumn)),1,'Past
Due', 'Outstanding'),  'Value 3',
Decode(Sign(Now()-TargetDateColumn)),1,'Past
Due', 'Outstanding'),  'Value 4')

لدي مجموعة محدودة من خيارات T-SQL للاستخدام والحالة عندما لا يكون خيارا. لدي isnull و coalsce، لكنني لست متأكدا مما إذا كانوا سيساعدوني في هذا واحد.

لا تهتم بحسابات التاريخ، يتم حل تلك.

لقد بحثت في حالة الأسئلة هنا، دون جدوى.

شكرا!

تحديث:

أدرك أنني يجب أن أحظي بمزيد من التفاصيل حول سبب القيود، لأن هذا هو مورد المطور، وسوف يفترض أن هذا هو منتج تطوير. ليس.

أنا أستخدم منتج برمجيات مؤسسة يحتوي على مصمم استعلام مدمج و SQL Pseudo-SQL الخاص به. لديها قيود على ما يمكنني استخدامه مع SQL Server وأوراكل. في الأساس، كل ما لا يكسر تحليل محرك الاستعلام المدمج هو لعبة. وهذا يعني أن جميع الوظائف والتعبيرات المعقوفة، بالإضافة إلى جميع مجادرات البيانات (الكائنات الداخلية التي تتوافق مع جدول مادي في قاعدة بيانات واستفسارات أخرى تم إنشاؤها باستخدام المنتج)، بالإضافة إلى كل شيء من Oracle SQL أو Transact SQL لا يكسر التحليل بشكل صريح وبعد

السبب في أن القضية عندما لا تعمل من أجلي هي أنه يكسر تحليل SQL Pseudo-SQL بواسطة محرك الاستعلام.

في النهاية، أود أن أحاول:

  1. استخدم فقط مصمم استعلام المنتج SQL الذي يمر بتحليل أو
  2. استخدم بعض الموارد الإضافية من قاعدة بيانات SQL Server ومصمم الاستعلام للحصول عليها.

بناء على العديد من الإجابات الجيدة التي حصلت عليها، إليك النهج الذي عمل لي، حتى الآن.

اقترح Jason Defontes أنه يمكنني استخدام عرض قاعدة بيانات لأداء القضية عندما تكون القواعد والذي يقع في # 2 أعلاه. إنه يعمل بالنسبة لي لأن الرأي ديناميكي بما فيه الكفاية لا يجب أن أقوم بعمل صيانة عليه (على عكس نهج جداول ريتشارتالنت للحقيقة، والتي أعتقد أنها قريبة من نهج جيسون). سيكون اقتراح Pascal الخاص بإنشاء وظيفة يتماشى على نفس الخطوط، ولكن ربما كسر التحليل.

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

بالنظر إلى أن هذا "استعمال رؤية" يعمل تصميم "بالنسبة لي، وأتساءل ما سيكون النهج الأكثر كفاءة:

  • باستخدام تحديد مع حالة متى؛
  • باستخدام CTE (مرة أخرى، ريتشاردالنت)؛
  • باستخدام الاتحاد الكل (hlgem)؛
  • استخدام السدود (misterzimbu)؛

ما زلت أتحقق من اقتراح أراميس وايلر، لأنه ربما يمكن أن يسقط في # 1 أعلاه.

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

مرة أخرى، أريد أن أشكركم جميعا على مساعدتكم وأطلب منك بلطف لتعديل أي شيء على السؤال الذي سقطت غير مناسب (إنه سؤالي الأول والإنجليزية هي لغتي الثانية).

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

المحلول

يمكنك تحريك القضية / عند المنطق في طريقة عرض، هل لديك أداة استعلام العرض؟

نصائح أخرى

هل لديك اتحاد متاح؟ ربما يمكنك كتابة استفسار لكل من الشروط بشرط الحالة الموجودة في حالة وجود جملة واتحادها معا.

هل تستطيع أن تكتب السدود المخصصة؟ ربما لا إذا لم يكن لديك حتى الوصول إلى القضية عندما، ولكن هذا ربما يعمل أيضا أيضا:

select
    ...,
    coalesce(c1.value, c2.value, c3.value, ..., <default value>)
from MyTable
left join (select <result 1> as value) c1 on <first condition>
left join (select <result 2> as value) c2 on <second condition>
left join (select <result 3> as value) c3 on <third condition>

اكتب دالة تؤدي الحساب باستخدام الحالة متى.

إنه قبيح ويعتمد على عدد القيم التي لديك قد لا تكون قابلة للحياة. لكن التحدث بدقة، وأعتقد أن هذا مثل هذا سيعمل كترجمة من قطاع الاستعلام أعلاه:

حدد "Pastdue" من TableName حيث الآن ()> TargetDatecolumn و (StatusColumn = "القيمة 1" أو StatusColumn = "القيمة 2" أو StatusColumn = "القيمة 3") Union حدد "المعلقة" حيث الآن () <targetDatecolumn و (StatureColumn = "القيمة 1" أو StatusColumn = "القيمة 2" أو StatusColumn = "قيمة 3") حدد الاتحاد "القيمة 4" حيث لا (StatusColumn = "القيمة 1" أو StatusColumn = "القيمة 2" أو StatusColumn = "القيمة 3")

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

أولا، قم بإنشاء جدول:

CREATE TABLE StatusLookup(
   value nvarchar(255),
   datesign shortint,
   result varchar(255));

الآن، قم بملء ذلك مع جدول الحقيقة (الكثير من المنطق المتكرر هنا على ما يبدو، ربما يجب أن يكون هذا طاولتين للحقيقة مع انضمام عبور بينهما):

INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 1', -1, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 1', 0, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 1', 1, 'Past Due')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 2', -1, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 2', 0, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 2', 1, 'Past Due')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 3', -1, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 3', 0, 'Outstanding')
INSERT INTO StatusLookup(value, datesign, result) VALUES ('Value 3', 1, 'Past Due')

أخيرا، انضم وتقديم إجابة افتراضية:

SELECT mytable.*, COALESCE(statuslookup.result, 'Value 4')
FROM
    mytable LEFT JOIN statuslookup ON
        statuslookup.value = StatusColumn
        AND statuslookup.datesign = Sign(Now()-TargetDateColumn)

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

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