ما هي أفضل طريقة لتحويل قيمة int أو null إلى قيمة منطقية في استعلام SQL؟
-
05-07-2019 - |
سؤال
ما هي أفضل طريقة لتحويل قيمة int أو null إلى قيمة منطقية في استعلام SQL، مثل:
- أي قيمة غير فارغة هي حقيقي في النتائج
- أي قيمة فارغة خطأ شنيع في النتائج
المحلول
على حد علمي (صححني إذا كنت مخطئا)، لا يوجد مفهوم للقيم المنطقية الحرفية في SQL.يمكن أن يكون لديك تعبيرات يتم تقييمها إلى قيم منطقية، لكن لا يمكنك إخراجها.
ومع ذلك، يمكنك استخدام CASE WHEN لإنتاج قيمة يمكنك استخدامها في المقارنة:
SELECT
CASE WHEN ValueColumn IS NULL THEN 'FALSE' ELSE 'TRUE' END BooleanOutput
FROM
table
نصائح أخرى
لا داعي لاستخدام الحالة...متى:
select (column_name is not null) as result from table_name;
يُرجع 1 لجميع الحقول غير NULL و0 لجميع الحقول التي تكون NULL، وهو أقرب ما يمكنك الوصول إليه من القيم المنطقية في SQL.
SELECT
CASE
WHEN thevalue IS NULL THEN 0
ELSE 1
END AS newVal
FROM .... (rest of select)
أعتقد أن الأمر يسير على هذا النحو
في الواقع، قد يلزم أن تكون قيمة ISNULL عندما تكون القيمة NULL ثم 0
على افتراض أنك تريد قيمة 0،1 كعائد، وأننا نتحدث عن عدد صحيح سأستخدم المنطق المحدد بواسطة توربيورن ولفه في الوظيفة
create function dbo.isNotNull(@a int)
returns bit
as
begin
return isnull(@a-@a+1,0)
end
لذا يمكنك استخدامه وقتما تشاء بمجرد الاتصال
select dbo.isNotNull(myIntColumn) from myTable
الجواب مقدم من تومالاك يعد أكثر عالمية لأنه يعمل مع أي نوع بيانات
قد ترغب في إجراء تحويل (BIT، Value) لنتيجتك.لأن شيئًا ما سيُرجعه SQL خطأً مفاده أن القيمة ليست منطقية.
isnull(column - column + 1, 0) != 0
في Oracle، بافتراض أنك تستخدم 0 للخطأ و1 للصواب: -
SELECT DECODE( col, NULL, 0, 1) FROM ...
يمكنك أيضًا كتابة هذا باستخدام بناء جملة CASE، ولكن ما سبق هو اصطلاحي في Oracle.DECODE يشبه إلى حد ما المفتاح/الحالة؛إذا كان العمود NULL فسيتم إرجاع 0، وإلا 1.
أقصر ما أعرفه عن Oracle:
SELECT NVL2(nullableColumn, 1, 0) FROM someTable
NVL2(value, ifNotNull, ifNull)
عائدات ifNotNull
إذا value
ليست فارغة، و ifNull
خلاف ذلك.
عادة عند استخدام 1، فهذا يعني أنه صحيح وإلا في حالة أخرى.
لذا:
SELECT IsDefault = CASE WHEN IsDefault = 1 THEN 'true' ELSE 'false' END
FROM table