Пометить Best Practice in SQL Oracle developer

У меня есть один вопрос, я только что создал много флагов в 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)",

Можете ли вы предоставить несколько примеров записей вашей таблицы?

procra 21.12.2020 08:38

Oracle рекомендует создавать varchar2 для хранения текста переменной длины.

Popeye 21.12.2020 08:39

И в select In Oracle можно измерить размер моего столбца?

user14696881 21.12.2020 08:42

Да, вы можете, хотя у varchar2 есть два разных варианта ограничения длины: chars или bytes, определяя varchar2(50) по умолчанию это будет char, varchar2(64 byte) даст 64-байтовое пространство, так как некоторые символы занимают более одного байта.

procra 21.12.2020 08:45

Хорошо, спасибо, за ДА или НЕТ я выбираю vachar2( ? ) ?

user14696881 21.12.2020 08:50

я бы использовал varchar2(4), потому что лично мне нравится придерживаться потенций 2. Другой вопрос: сколько у вас всего флагов? В противном случае было бы более устойчивым к изменениям, если бы вы отправили флаги в другую таблицу.

procra 21.12.2020 09:00

Хммм хорошая идея, я думаю 10 -15 флаг. Можете ли вы объяснить мне преимущество? Это не новая таблица, это представление в Oracle Select...

user14696881 21.12.2020 09:02

Хорошо, я должен исправить себя, если вы храните каждый флаг в одном столбце, вы можете оставить их как есть. Я подумал о случае, когда кто-то использовал 13 флагов внутри одного поля. Это возможно и с number, но недостатком является то, что вы должны подробно документировать значение каждого флага таким образом, чтобы вы и другие могли найти его позже. Также мы все должны были надеяться, что значение (и рейтинг) флага не изменится в любое время, потому что у нас будет очень много работы по удалению старых флагов из всех столбцов.

procra 21.12.2020 09:17

Да, я всегда делаю комментарий с описанием. Значит, у меня нет преимущества в создании маленькой таблицы, кроме только флага?

user14696881 21.12.2020 09:29

Не совсем, за исключением того, что количество флагов может измениться в будущем

procra 21.12.2020 09:34

Хм, они могут изменить определение и постоянно меняющееся количество флагов.

user14696881 21.12.2020 09:37

Я не уверен, почему тип данных вообще учитывается при создании представления. Oracle назначит тип данных, если вы явно не приведете выражение к чему-то другому. Или вы спрашиваете о соглашении об именах - YES/NO, Y/N, 0/1 и т. д.?

William Robertson 21.12.2020 12:02

@WilliamRobertson, моим будущим пользователям нужно ДА/НЕТ. Но я не знаю, выберет ли оракул лучший тип данных. Потому что другого ответа, кроме ДА/НЕТ, не будет

user14696881 21.12.2020 12:42

Он выберет VARCHAR2(3), что будет хорошо. Хотя что вас беспокоит? Это всего лишь столбец представления, поэтому хранение не учитывается. В документации прямо сказано не использовать VARCHAR, и не заставляйте меня начинать с CHAR.

William Robertson 21.12.2020 12:44
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
14
429
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В 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;

Другие вопросы по теме