Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / null||string -> null / 25 сообщений из 32, страница 1 из 2
21.09.2019, 14:09
    #39865001
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Подскажите, можно ли без дополнительного nvl2 сделать так, чтобы конкатенация строки с null давала null?
Нужно примерно в таком запросе: select coalesce('книга '||i1.value, 'журнал '||i2.value, 'id #'||i3.value)
В Access/Oracle есть два оператора для соединения строк (+ и &), которые как раз и отличаются обработкой null.
Есть ли подобная хитрость в Oracle?
...
Рейтинг: 0 / 0
21.09.2019, 19:14
    #39865079
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Кейс и декоде тоже не подойдёт?
...
Рейтинг: 0 / 0
21.09.2019, 21:42
    #39865102
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
decode это как?
case можно, но с nvl2 понятнее и компактнее.
Я думал, что может быть можно как-то проще, чем coalesce(nvl2(i1.value, 'книга '||i1.value, null), nvl2(i2.value, 'журнал '||i2.value, null), 'запись #'||i.value).
...
Рейтинг: 0 / 0
21.09.2019, 21:46
    #39865103
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Alibek B.decode это как?
case можно, но с nvl2 понятнее и компактнее.
Я думал, что может быть можно как-то проще, чем coalesce(nvl2(i1.value, 'книга '||i1.value, null), nvl2(i2.value, 'журнал '||i2.value, null), 'запись #'||i.value).по-моему, как раз кейс проще и понятнее
Код: plsql
1.
2.
3.
4.
5.
case
    when i1.value is not null then 'книга ' ||i1.value
    when i2.value is not null then 'журнал '||i2.value
    when i3.value is not null then 'id #'   ||i3.value
end
...
Рейтинг: 0 / 0
21.09.2019, 21:50
    #39865106
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with s(i1_value, i2_value, i3_value) as (
select '1', '', '' from dual union all
select '', '2', '' from dual union all
select '', '', '3' from dual)
select coalesce(
                    nullif('книга '||i1_value, 'книга '),
                    nullif('журнал '||i2_value, 'журнал '),
                    nullif('id #'||i3_value, 'id #')
               ) cls
from s;

CLS
--------------
книга 1
журнал 2
id #3

P.S. Но я бы оставил nvl2.
...
Рейтинг: 0 / 0
22.09.2019, 08:10
    #39865154
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Alibek B.
Код: plsql
1.
coalesce(nvl2(i1.value, 'книга '||i1.value, null), nvl2(i2.value, 'журнал '||i2.value, null), 'запись #'||i.value)

можно запутать еще больше :)

Код: plsql
1.
coalesce(nvl2(i1.value, 'книга '||i1.value, nvl2(i2.value, 'журнал '||i2.value, 'запись #'||i3.value)))
...
Рейтинг: 0 / 0
22.09.2019, 10:08
    #39865173
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Код: plsql
1.
2.
3.
4.
5.
6.
nvl2(i1.value,
        'книга '||i1.value,
         nvl2(i2.value,
              'журнал '||i2.value,
              'запись #'||i3.value)
    )
...
Рейтинг: 0 / 0
23.09.2019, 10:25
    #39865446
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Нет, это уже совсем не то.
Вариант MSSQL (с использованием +) выглядел бы наиболее красиво.
Если его нет, то или case (логично и ясно, но громоздко), или coalesce с nvl2 (компактно и тоже логично).
А вложенные nvl2 только все запутывают и обязательно приведут к путаницам в подсчетах вложенных скобок.
...
Рейтинг: 0 / 0
23.09.2019, 10:36
    #39865454
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Alibek B.путаницам в подсчетах вложенных скобок.хм...
...
Рейтинг: 0 / 0
23.09.2019, 13:59
    #39865626
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Alibek B.,

да уж создал бы свою функцию/оператор и назвал типа ANSI_CONCAT
...
Рейтинг: 0 / 0
23.09.2019, 14:05
    #39865635
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Странное предложение. А что это мне даст? Какая разница, писать nvl2(i.value, 'abc'||i.value, null) или ansi_concat(i.value, 'abc')? Ни в количестве символов, ни в быстродействии, ни в ясности какой-то существенной разницы не будет.
Вот если бы можно было перезагрузить оператор + для строковых значений, в этом был бы практический смысл, было бы красиво и компактно.
...
Рейтинг: 0 / 0
23.09.2019, 14:30
    #39865664
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Alibek B.Ни в количестве символов
Код: plsql
1.
2.
nvl2(i.value, 'abc'||i.value, null) 
ansi_concat(i.value, 'abc')

Alibek B.ни в ясностиправда?

зы. https://community.oracle.com/ideas/19866
...
Рейтинг: 0 / 0
23.09.2019, 14:32
    #39865668
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Alibek B.,

ну и для полноты картины: твой вариант с nvl2 отталкивается от is null для одного значения, а не обоих
...
Рейтинг: 0 / 0
23.09.2019, 14:44
    #39865684
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
xtenderправда?
Да, nvl2 более универсален и понятен, чем отдельная специальная функция.

'Клиент #' & id & (', телефон '+phone) & ('адрес: '+adr & ('/'+build+' (строение)'))
'Клиент #'||id || nvl2(phone, ', телефон '||phone, '') || nvl2(adr, 'адрес: '||adr || nvl2(build, '/'||build||' (строение)', ''), '')
'Клиент #'||id || ansi_concat(phone, ', телефон ') || ansi_concat(adr, 'адрес: ' || nvl2(build, '/'||build||' (строение)', ''))
...
Рейтинг: 0 / 0
23.09.2019, 16:38
    #39865767
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Alibek B.,

ну, если ты не знаешь, что такое стандарт ANSI и функция CONCAT, которая, кстати, есть в оракле, но ее оракловая реализация несовместима с ANSI...
...
Рейтинг: 0 / 0
24.09.2019, 03:02
    #39866009
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Alibek B.'Клиент #' & id & (', телефон '+phone) & ('адрес: '+adr & ('/'+build+' (строение)'))
'Клиент #'||id || nvl2(phone, ', телефон '||phone, '') || nvl2(adr, 'адрес: '||adr || nvl2(build, '/'||build||' (строение)', ''), '')
'Клиент #'||id || ansi_concat(phone, ', телефон ') || ansi_concat(adr, 'адрес: ' || nvl2(build, '/'||build||' (строение)', ''))
если вас интересует именно синтаксический сахар, то его, к сожалению/счастью (по вкусу), нет.

а дальше надо смотреть на ваши приоритеты.

если это максимальная читабельность, поддерживаемость, и отсутствие подсчета скобок при приемлемой скорости, то сравнивать три варианта выше надо не друг с другом (они все плохие), а с отдельной pl/sql функцией, собирающей элементы адреса в строку.

если же вам зачем-то нужно выдавить всё до последней миллисекунды, то приемлемую читабельность вам в первую очередь обеспечит не сахар и не выбор между nvl2/nullif/case/decode, а нормальное форматирование.
...
Рейтинг: 0 / 0
24.09.2019, 09:05
    #39866054
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Alibek B.жно было перезагрузить оператор + для строковых значений, в этом был бы практический смысл, было бы красиво и компактно.
імхо
ноги ростут из-за игнорирования оряклем третьего правила

авторПравило 3: Систематическая поддержка отсутствующих значений (Systematic Treatment of Null Values):

Неизвестные, или отсутствующие значения NULL, отличные от любого известного значения, должны поддерживаться для всех типов данных при выполнении любых операций. Например, для числовых данных неизвестные значения не должны рассматриваться как нули, а для символьных данных — как пустые строки .

Еще с времен семерки ходила мулька об varchar2, типа доделают (будьте бдительны)

для varchar2 будет по старинке '' is null,
а для varchar пустая строка будет уже is NOT null

.....
stax
...
Рейтинг: 0 / 0
24.09.2019, 09:28
    #39866067
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Staxноги ростут из-за игнорирования оряклем третьего правила

авторПравило 3: Систематическая поддержка отсутствующих значений (Systematic Treatment of Null Values):

Неизвестные, или отсутствующие значения NULL, отличные от любого известного значения, должны поддерживаться для всех типов данных при выполнении любых операций. Например, для числовых данных неизвестные значения не должны рассматриваться как нули, а для символьных данных — как пустые строки .
За "правило" ты выдаешь вольный пересказ. Но даже в этом пересказе нет указаний на "игнорирования оряклем".
...
Рейтинг: 0 / 0
24.09.2019, 09:29
    #39866068
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Stax(будьте бдительны)Хватит уже распространять гнилые мифы. Семантика varchar2 никогда не изменится. А некоего varchar-а нет и не предвидится.
...
Рейтинг: 0 / 0
24.09.2019, 12:07
    #39866175
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Elic,

авторГЛАВА 3

████████████████████████████████████████████████████████████████

ВЫБОР ТИПА ДАННЫХ

Тип данных VARCHAR

Тип данных VARCHAR в настоящее время является синонимом типа
данных VARCHAR2. Однако в будущей версии ORACLE тип данных
VARCHAR будет хранить строки символов переменной длины с иной
семантикой сравнения. Поэтому используйте тип данных VARCHAR2
для символьных строк переменной длины.




.....
stax
...
Рейтинг: 0 / 0
24.09.2019, 12:16
    #39866188
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
-2-Staxноги ростут из-за игнорирования оряклем третьего правила

пропущено...
За "правило" ты выдаешь вольный пересказ. Но даже в этом пересказе нет указаний на "игнорирования оряклем".

ето не мой пересказ, а из русской википедии

что значит нет указавний, прямое противоречие
Null не должен рассматриватся как пустая строкa ('' is not null)

.....
stax
...
Рейтинг: 0 / 0
24.09.2019, 12:18
    #39866190
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
авторбудетПереводчик не угадал с модальностью глагола, а ты постоянно порешь страшилки, не понимая их сути.
...
Рейтинг: 0 / 0
24.09.2019, 12:41
    #39866217
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
StaxNull не должен рассматриватся как пустая строкa ('' is not null)В скобочках обратное утверждению выражение. Утверждение нарушалось бы, если выражение length(null)=0 даст истину.
...
Рейтинг: 0 / 0
24.09.2019, 12:43
    #39866219
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
ElicавторбудетПереводчик не угадал с модальностью глагола, а ты постоянно порешь страшилки, не понимая их сути.

как перевести?
авторRule 3: Systematic treatment of null values:

Null values (distinct from the empty character string or a string of blank characters and distinct from zero or any other number) are supported in fully relational DBMS for representing missing information and inapplicable information in a systematic way, independent of data type.


оракле поддерживает третье правило?

зы
страшилок уже ни грамульки не боюсь

....
stax
...
Рейтинг: 0 / 0
24.09.2019, 12:45
    #39866222
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null||string -> null
Staxоракле поддерживает третье правило?Ты не умеешь читать оракловую документацию?!
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / null||string -> null / 25 сообщений из 32, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]