سؤال

<ع> استخدام ينفورميكس، لقد إنشاء جدول tempory التي أحاول أن نشر من بيان حدد. بعد هذا، أريد أن أفعل تحديثا، لتجميع المزيد من الحقول في الجدول tempory.

وهكذا أنا أفعل شيء من هذا القبيل؛

create temp table _results (group_ser int, item_ser int, restype char(4));

insert into _results (group_ser, item_ser)
select 
      group_ser, item_ser, null
from
      sometable

ولكن لا يمكنك تحديد فارغة.

وعلى سبيل المثال؛

select first 1 current from systables

ويعمل ولكن

select first 1 null from systables

وفشل!

و(لا يحصل لي بدأت لماذا لا أستطيع أن مجرد القيام SQL خادم مثل "حدد التيار" مع عدم وجود الجدول المحدد!)

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

المحلول

هذه الصفحة يقول السبب لا تستطيع أن تفعل ذلك هو لأن "NULL" لايوجد نوع. لذا، فإن الحل هو إنشاء sproc أن يعود ببساطة NULL في النوع الذي تريده.

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

DEFINE dummy INT;
LET dummy = NULL;

SELECT group_ser, item_ser, dummy
FROM sometable

نصائح أخرى

وليس لديك لكتابة الإجراء المخزن. عليك ببساطة أن أقول IDS نوع هو NULL. على افتراض انك لا تستخدم IDS 7.31 (التي لا تدعم أي تدوين الزهر)، يمكنك كتابة:

SELECT NULL::INTEGER FROM dual;

SELECT CAST(NULL AS INTEGER) FROM dual;

وإذا لم يكن لديك dual كجدول (وربما كنت لا)، يمكنك أن تفعل واحدة من عدد قليل من الأشياء:

CREATE SYNONYM dual FOR sysmaster:"informix".sysdual;

وتمت إضافة الجدول 'sysdual "مؤخرا نسبيا (IDS 11.10، IIRC)، حتى إذا كنت تستخدم نسخة قديمة، وسوف غير موجود. الأعمال التالية مع أي إصدار من IDS - هذا ما يمكنني استخدام

-- @(#)$Id: dual.sql,v 2.1 2004/11/01 18:16:32 jleffler Exp $
-- Create table DUAL - structurally equivalent to Oracle's similarly named table.
-- It contains one row of data.

CREATE TABLE dual
(
    dummy CHAR(1) DEFAULT 'x' NOT NULL CHECK (dummy = 'x') PRIMARY KEY
) EXTENT SIZE 8 NEXT SIZE 8;
INSERT INTO dual VALUES('x');

REVOKE ALL ON dual FROM PUBLIC;
GRANT SELECT ON dual TO PUBLIC;

واصطلاحا، إذا كنت تسير على SELECT من Systables للحصول على صف واحد، يجب أن تشمل "WHERE tabid = 1 '؛ هذا هو دخول Systables نفسها، وإذا كان مفقودا، والحقيقة أن عبارة SELECT الخاص بك لا يرجع أي بيانات هو أقل من مشاكلك. (أنا لم أر قط أنه خطأ، وإن كان.)

SELECT group_ser, item_ser, replace(null,null) as my_null_column
FROM sometable

وأو يمكنك استخدام nvl(null,null) للعودة فارغة لبيان حدد الخاص بك.

هل هناك أي سبب للذهاب لطاولة الفعلي؟ لقد تم استخدام

select blah from table(set{1})
select blah from table(set{1})

وهو لطيف عندما كنت تستخدم قاعدة بيانات 10.X. لا هذا البيان لا تلمس قاعدة البيانات. كمية من عمليات القراءة / الكتابة يساوي 0،

ولكن

وعندما كنت تستخدم 11.X لن يكلفك 4500 على الأقل عازلة يقرأ لأن هذا الإصدار من ينفورميكس يخلق هذا الجدول في الذاكرة وتنفيذ الاستعلام ضدها.

select to_date(null) from table;

وهذا يعمل عندما أريد أن الحصول على موعد مع قيمة خالية

ويمكنك استخدام هذا التعبير ( '' +1) على قائمة SELECT، بدلا من الكلمة فارغة. وهي تقيم لقيمة فارغة من نوع العشرى (2،0).

وهذا ( '' +1.0001) يقيم إلى العشرى (16،4). وهلم جرا.

إذا كنت تريد موعد نوع استخدام DATE ( '' + 1) للحصول على قيمة فارغة من نوع DATE.

و( '' + 1) || " "تقييم إلى سلسلة فارغة من نوع VARCHAR (1).

لحصول على قيمة فارغة من نوع VARCHAR (1) استخدام هذا التعبير: DATE ( '' + 1) || " '

ويعمل في 9.x من و11.X.

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