У меня есть один вопрос, я только что создал много флагов в CASE (... «да» или «нет», и я не знаю, как лучше конвертировать в наименьший формат VARCHAR или VACHAR2?
Как этот :
-- Создано в FO (флаг)
CASE
WHEN CRE_DD.DIVISION IN(
'Postinfo 1st line' ,
'CX - CC INFODESK' ,
'CC FO First Line' ,
'CX - CC MIDDLE OFFICE'
)
OR ( CRE_DD.DIVISION = 'FINES CC' AND DSR.ENTRY_CHANNEL = 'Phone')
THEN 'YES'
ELSE 'NO'
END AS "Created in FO (flag)",
--Обработка ФО (флаг)
CASE
WHEN CUR_DD.DIVISION IN ('Postinfo 1st line' ,'CX - CC INFODESK','CC FO First Line' )
OR (CUR_DD.DIVISION = 'FINES CC' AND DSR.ENTRY_CHANNEL = 'Phone')
THEN 'YES'
ELSE 'NO'
END AS "FO treatment (flag)",
Oracle рекомендует создавать varchar2
для хранения текста переменной длины.
И в select In Oracle можно измерить размер моего столбца?
Да, вы можете, хотя у varchar2
есть два разных варианта ограничения длины: char
s или byte
s, определяя varchar2(50)
по умолчанию это будет char
, varchar2(64 byte)
даст 64-байтовое пространство, так как некоторые символы занимают более одного байта.
Хорошо, спасибо, за ДА или НЕТ я выбираю vachar2( ? ) ?
я бы использовал varchar2(4), потому что лично мне нравится придерживаться потенций 2. Другой вопрос: сколько у вас всего флагов? В противном случае было бы более устойчивым к изменениям, если бы вы отправили флаги в другую таблицу.
Хммм хорошая идея, я думаю 10 -15 флаг. Можете ли вы объяснить мне преимущество? Это не новая таблица, это представление в Oracle Select...
Хорошо, я должен исправить себя, если вы храните каждый флаг в одном столбце, вы можете оставить их как есть. Я подумал о случае, когда кто-то использовал 13 флагов внутри одного поля. Это возможно и с number
, но недостатком является то, что вы должны подробно документировать значение каждого флага таким образом, чтобы вы и другие могли найти его позже. Также мы все должны были надеяться, что значение (и рейтинг) флага не изменится в любое время, потому что у нас будет очень много работы по удалению старых флагов из всех столбцов.
Да, я всегда делаю комментарий с описанием. Значит, у меня нет преимущества в создании маленькой таблицы, кроме только флага?
Не совсем, за исключением того, что количество флагов может измениться в будущем
Хм, они могут изменить определение и постоянно меняющееся количество флагов.
Я не уверен, почему тип данных вообще учитывается при создании представления. Oracle назначит тип данных, если вы явно не приведете выражение к чему-то другому. Или вы спрашиваете о соглашении об именах - YES
/NO
, Y
/N
, 0
/1
и т. д.?
@WilliamRobertson, моим будущим пользователям нужно ДА/НЕТ. Но я не знаю, выберет ли оракул лучший тип данных. Потому что другого ответа, кроме ДА/НЕТ, не будет
Он выберет VARCHAR2(3)
, что будет хорошо. Хотя что вас беспокоит? Это всего лишь столбец представления, поэтому хранение не учитывается. В документации прямо сказано не использовать VARCHAR
, и не заставляйте меня начинать с CHAR.
В Oracle есть только строковые типы данных VARCHAR2
или CHAR
, которые применимы к вашим данным (NVARCHAR2
, NCHAR
и CLOB
не подходят).
VARCHAR является синонимом VARCHAR2; поэтому спрашивать, следует ли вам использовать один или другой, бессмысленно, поскольку это одно и то же. Просто используйте VARCHAR2
, а не его синоним.
Не используйте CHAR
, так как он будет дополнять строку справа пробелами, поэтому у вас не будет 'NO'
, но вместо этого будет 'NO '
, и он может не всегда вести себя так, как ожидалось, при сравнении, и вам придется обрезать конечные пробелы.
Если вы используете строки переменной длины, которые могут быть либо 'YES'
, либо 'NO'
, и вы хотите поместить их в таблицу, определите столбец как VARCHAR2(3)
.
Например:
CREATE TABLE your_table (
id NUMBER(10,0)
GENERATED ALWAYS AS IDENTITY
CONSTRAINT your_table__id__pk PRIMARY KEY,
data NUMBER,
flag VARCHAR2(3)
NOT NULL
CONSTRAINT your_table__flag__ck CHECK ( flag IN ( 'YES', 'NO' ) )
);
INSERT INTO your_table ( data, flag )
SELECT data,
CASE
WHEN some_condition = 1
THEN 'YES'
ELSE 'NO'
END
FROM other_table;
Если вы используете представление, просто используйте строковые литералы 'YES'
и 'NO'
и разрешите Oracle неявно управлять типом данных, и вам не нужно об этом беспокоиться.
Например:
CREATE VIEW your_view ( id, data, flag ) AS
SELECT id,
data,
CASE
WHEN some_condition = 1
THEN 'YES'
ELSE 'NO'
END
FROM other_table;
Можете ли вы предоставить несколько примеров записей вашей таблицы?