Для Iseries/IBMi DB2.
Я соединяю несколько файлов/таблиц вместе.
Я написал код как в DDS, так и в SQL.
Логический файл DDS работает точно так, как ожидалось, но я не могу использовать его для встроенного sql в rpgle, так как по умолчанию он использует механизм SQE, что приводит к ужасной производительности.
С другой стороны, в представлении SQL было NULLs
, пока я не использовал IFNULL( MBRDESCR, '')
. Но теперь MBRDECSR
это VARCHAR
. Что неприемлемо.
Итак, как мне создать соединение SQL без NULLs
и VARCHARs
?
Запрошенный пример кода:
ДДС:
JDFTVAL R TRANSR JFILE(TRANSPF MBRPF) J JOIN(1 2) JFLD(MBRID MBRID) * TRANSID JREF(1) MBRID JREF(1) MBRNAME JREF(2) MBRSURNME JREF(2) * K TRANSID K MBRID
SQL:
CREATE VIEW TRANSV01 AS ( SELECT TRANSID , MBRID , CAST(IFNULL(MBRNAME , '') as Char(20)) , CAST(IFNULL(MBRSURNME, '') as Char(25)) FROM TRANSPF --Member Name LEFT OUTER JOIN MBRPF on MBRID = MBRID ) RCDFMT TRANSR;
Обратите внимание на следующее:
Пример выше упрощен
Не каждый MBRID в TRANSPF имеет соответствующую запись в MBRPF (т. е. нет ссылочного ограничения). Таким образом, когда MBRPF присоединяется к TRANSPF, в MBRNAME, MBRSURNME будут значения NULL. Если не используется JDFTVAL или IFNULL().
Я предпочитаю не иметь VARCHAR из-за производительности и extname() в rpgle.
Я предпочитаю не иметь значений NULL, я не хочу, чтобы pgm их обрабатывал.