سؤال
أرغب في إنشاء إجراء مخزن باستخدام المعلمات التي تشير إلى الحقول التي يجب تحديدها.
على سبيل المثالأرغب في تمرير معلمتين "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();