سؤال

أرغب في إنشاء إجراء مخزن باستخدام المعلمات التي تشير إلى الحقول التي يجب تحديدها.

على سبيل المثالأرغب في تمرير معلمتين "selectField1" و"selectField2" لكل منهما على شكل منطقي.

ثم أريد شيئا من هذا القبيل

SELECT

if (selectField1 = true) Field1 ELSE do not select Field1

if (selectField2 = true) Field2 ELSE  do not select Field2

FROM Table

شكرا كارل

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

المحلول

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

IF (selectField1 = true AND selectField2 = true)
BEGIN
   SELECT Field1, Field2
   FROM Table
END
ELSE IF (selectField1 = true)
BEGIN
   SELECT Field1
   FROM Table
END
ELSE IF (selectField2 = true)
BEGIN
   SELECT Field2
   FROM Table
END

والحيوي SQL سوف يساعد مع مضاعفات. هذه الأمثلة هو افتراض أتلست العمود 1 هو الصحيح.

DECLARE @sql varchar(MAX)
SET @sql = 'SELECT '
IF (selectField1 = true)
BEGIN
   SET @sql = @sql + 'Field1, '
END
IF (selectField2 = true)
BEGIN
   SET @sql = @sql + 'Field2, '
END
...
-- DROP ', '
@sql = SUBSTRING(@sql, 1, LEN(@sql)-2)

SET @sql = @sql + ' FROM Table'

EXEC(@sql)

نصائح أخرى

في SQL، يمكنك أن تفعل ذلك بهذه الطريقة:

SELECT  CASE WHEN @selectField1 = 1 THEN Field1 ELSE NULL END,
        CASE WHEN @selectField2 = 1 THEN Field2 ELSE NULL END
FROM    Table

ولا يعني العلائقية نموذج العد المجال الحيوي.

وبدلا من ذلك، إذا كنت لا ترغب في قيمة حقل، يمكنك فقط اختيار NULL بدلا من ذلك وتحليل ذلك على العميل.

تريد CASE إفادة:

SELECT
  CASE 
    WHEN @SelectField1 = 1 THEN Field1
    WHEN @SelectField2 = 1 THEN Field2
    ELSE NULL
  END AS NewField
FROM Table

يحرر:المثال الخاص بي هو دمج الحقلين في حقل واحد، اعتمادًا على المعلمات المتوفرة.إنها واحد أو لا شيء الحل (وليس كلاهما).إذا كنت تريد إمكانية وجود كلا الحقلين في الإخراج، استخدم حل Quassnoi.

@selectField1 AS bit
@selectField2 AS bit

SELECT
CASE 
    WHEN @selectField1 THEN Field1
    WHEN @selectField2 THEN Field2
    ELSE someDefaultField
END
FROM Table

وهذا هو ما كنت تبحث عنه؟

وهذا هو وسيلة الزائفة للقيام بذلك

IF (selectField1 = true) 
SELECT Field1 FROM Table
ELSE
SELECT Field2 FROM Table

وما تريده هو:

    MY_FIELD=
        case 
            when (selectField1 = 1) then Field1
                                 else Field2        
        end,

وفي اختيار

ولكن، ص لا يمكنك فقط لا تظهر هذا العمود في برنامجك؟

والطريقة مستجد للقيام بذلك:

SELECT field1, field2 FROM table WHERE field1 = TRUE OR field2 = TRUE

ويمكنك إدارة هذه المعلومات بشكل صحيح في لغة البرمجة به فقط إذا-آخر.

وعلى سبيل المثال في ASP / جافا سكريبت

// Code to retrieve the ADODB.Recordset
if (rs("field1")) {
   do_the_stuff_a();
}
if (rs("field2")) {
   do_the_stuff_b();
}
rs.MoveNext();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top