powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / null||string -> null
32 сообщений из 32, показаны все 2 страниц
null||string -> null
    #39865001
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, можно ли без дополнительного nvl2 сделать так, чтобы конкатенация строки с null давала null?
Нужно примерно в таком запросе: select coalesce('книга '||i1.value, 'журнал '||i2.value, 'id #'||i3.value)
В Access/Oracle есть два оператора для соединения строк (+ и &), которые как раз и отличаются обработкой null.
Есть ли подобная хитрость в Oracle?
...
Рейтинг: 0 / 0
null||string -> null
    #39865079
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кейс и декоде тоже не подойдёт?
...
Рейтинг: 0 / 0
null||string -> null
    #39865102
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
decode это как?
case можно, но с nvl2 понятнее и компактнее.
Я думал, что может быть можно как-то проще, чем coalesce(nvl2(i1.value, 'книга '||i1.value, null), nvl2(i2.value, 'журнал '||i2.value, null), 'запись #'||i.value).
...
Рейтинг: 0 / 0
null||string -> null
    #39865103
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
null||string -> null
    #39865106
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
null||string -> null
    #39865154
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
null||string -> null
    #39865173
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
nvl2(i1.value,
        'книга '||i1.value,
         nvl2(i2.value,
              'журнал '||i2.value,
              'запись #'||i3.value)
    )
...
Рейтинг: 0 / 0
null||string -> null
    #39865446
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, это уже совсем не то.
Вариант MSSQL (с использованием +) выглядел бы наиболее красиво.
Если его нет, то или case (логично и ясно, но громоздко), или coalesce с nvl2 (компактно и тоже логично).
А вложенные nvl2 только все запутывают и обязательно приведут к путаницам в подсчетах вложенных скобок.
...
Рейтинг: 0 / 0
null||string -> null
    #39865454
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.путаницам в подсчетах вложенных скобок.хм...
...
Рейтинг: 0 / 0
null||string -> null
    #39865626
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Alibek B.,

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

ну и для полноты картины: твой вариант с nvl2 отталкивается от is null для одного значения, а не обоих
...
Рейтинг: 0 / 0
null||string -> null
    #39865684
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
null||string -> null
    #39865767
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Alibek B.,

ну, если ты не знаешь, что такое стандарт ANSI и функция CONCAT, которая, кстати, есть в оракле, но ее оракловая реализация несовместима с ANSI...
...
Рейтинг: 0 / 0
null||string -> null
    #39866009
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
null||string -> null
    #39866054
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.жно было перезагрузить оператор + для строковых значений, в этом был бы практический смысл, было бы красиво и компактно.
імхо
ноги ростут из-за игнорирования оряклем третьего правила

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

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

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

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

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

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

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

авторГЛАВА 3

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

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

Тип данных VARCHAR

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




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

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

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

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

.....
stax
...
Рейтинг: 0 / 0
null||string -> null
    #39866190
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторбудетПереводчик не угадал с модальностью глагола, а ты постоянно порешь страшилки, не понимая их сути.
...
Рейтинг: 0 / 0
null||string -> null
    #39866217
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxNull не должен рассматриватся как пустая строкa ('' is not null)В скобочках обратное утверждению выражение. Утверждение нарушалось бы, если выражение length(null)=0 даст истину.
...
Рейтинг: 0 / 0
null||string -> null
    #39866219
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
null||string -> null
    #39866222
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxоракле поддерживает третье правило?Ты не умеешь читать оракловую документацию?!
...
Рейтинг: 0 / 0
null||string -> null
    #39866240
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicStaxоракле поддерживает третье правило?Ты не умеешь читать оракловую документацию?!
переводную (русский/польский) да, английскую с большим трудом

в оракле поддерживается третье правило Кодда для строк, или нет?

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

кстати,
в старых версиях length('')=0, если в кого-то остался третий форм можете проверить

....
stax
...
Рейтинг: 0 / 0
null||string -> null
    #39866249
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxанглийскую с большим трудомТогда возьми за правило, если тебе сказали, что нечто - это миф, а ты не можешь ни подтвердить его, ни опровергнуть, то хотя бы не распространяй его больше.
...
Рейтинг: 0 / 0
null||string -> null
    #39866252
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxкак перевести?автор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.


оракле поддерживает третье правило?Null values are supported? Да.
in a systematic way? Затрудняюсь опровергнуть. Поэтому Да.
independent of data type? Не понятно, что имелось ввиду под independent. Если, что null не имеет типа, то частично Да.
В скобочках приписка, что NULL отличается от пустой строки. Но не утверждается, что character string должен быть реализован под именем varchar2 или varchar.

Правила Кодда слишком абстрактны. Если и придираться, то к полноте поддержки ansi sql:Oracle Compliance to Core SQLOracle fully supports these subfeatures:
E021-01, CHARACTER data type
E021-07, Character concatenation
E021-08, UPPER and LOWER functions
E021-09, TRIM function
E021-10, Implicit casting among character data types

Oracle partially supports these subfeatures:
E021-02, CHARACTER VARYING data type (Oracle does not distinguish a zero-length VARCHAR string from NULL)
E021-03, Character literals (Oracle regards the zero-length literal '' as being null)
E021-12, Character comparison (Oracle's rules for padding the shorter of two strings to be compared differs from the standard)

Staxпочему обратное?Потому что в используемом для утверждения языке принято читать слева направо.
...
Рейтинг: 0 / 0
null||string -> null
    #39866278
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Staxкак перевести?пропущено...


оракле поддерживает третье правило?Null values are supported? Да.
in a systematic way? Затрудняюсь опровергнуть. Поэтому Да.
independent of data type? Не понятно, что имелось ввиду под independent. Если, что null не имеет типа, то частично Да.
В скобочках приписка, что NULL отличается от пустой строки. Но не утверждается, что character string должен быть реализован под именем varchar2 или varchar.

Правила Кодда слишком абстрактны. Если и придираться, то к полноте поддержки ansi sql:Oracle Compliance to Core SQLOracle fully supports these subfeatures:
E021-01, CHARACTER data type
E021-07, Character concatenation
E021-08, UPPER and LOWER functions
E021-09, TRIM function
E021-10, Implicit casting among character data types

Oracle partially supports these subfeatures:
E021-02, CHARACTER VARYING data type (Oracle does not distinguish a zero-length VARCHAR string from NULL)
E021-03, Character literals (Oracle regards the zero-length literal '' as being null)
E021-12, Character comparison (Oracle's rules for padding the shorter of two strings to be compared differs from the standard)

Staxпочему обратное?Потому что в используемом для утверждения языке принято читать слева направо.

Конечно что Кодд не рассматривал varchar2 или varchar
я про оракля (из доки)
авторТип данных VARCHAR

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


под "с иной семантикой сравнения" некоторые мои учителя понимали и что будет разница между null и '' (пустой строкой)

зи
насчет читать слева направо
'' not is null мож и так правильно, не спорю мне обычнее '' is not null

....
stax
...
Рейтинг: 0 / 0
null||string -> null
    #39868562
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

ну и куда пошёл, в какую сторону?
...
Рейтинг: 0 / 0
null||string -> null
    #39868632
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я изначально сделал через nvl2, так и оставил. Думал переделать, если подскажут что-то более удобное.
У варианта с case свои плюсы, но в данном случае менять не стал.
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / null||string -> null
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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