184 похожих чатов

Привет, подскажите есть ли что-то к кликхаусе типа if, но

немного другой логикой:

Например для if вычисляется сложное знаение, потом сравнивается условие и если оно выполнено, взять вычиленное значение, если не выполнено взять дефолт

Проблема простого if в двойном вычислении.

Например if (number > 17, 10, number)
Вот если nubmer это что-то сложно вычисляемое, можно ли вычислить его 1 раз, прихранить, потом проверить if и потом не считать второй раз в else?

14 ответов

81 просмотр

вообще если number выражение даст константу то with можно юзать

Dmnk ninja
вообще если number выражение даст константу то wit...

with не хранит, при каждом обращении к with будет высчитываться

Витя-Сергеев Автор вопроса
Clir
with не хранит, при каждом обращении к with будет ...

А это везде так или только у кликхауса?

Витя Сергеев
А это везде так или только у кликхауса?

точно не везде. Postgres по моему матерелизует with Oracle с хинтом тоже

Можно попробовать использовать transform, вместо if. Был опыт его успешного применения под аналогичную задачу

Anton Vershinin
Можно попробовать использовать transform, вместо i...

Хотя, пожалуй, под Вашу задачу не выйдет. Но если если все сводится к var number = сложное вычисление if (number > 10) { number = 10 } то кажется, можно обойтись просто least(number, 10)?

если у вас вычисление простое типа примера, то делайте двойное вычисление, оно быстрее. костыли имеют смысл если у вас супер multiIf на 500 условий, или вложенные If на 5-10 уровней со сложной математикой/лямбдами

Витя-Сергеев Автор вопроса
【D】【J】
если у вас вычисление простое типа примера, то дел...

Там вычисление времени между датами, и если оно превышает 30 минут то взять 30 минут, если меньше то взять существующее. Вот выше подсказали least, выглядит лучшим решением)

а с чего бы это оно вычисляется два раза? Вы проверяли? Вроде как должно быть 1 раз. Особенно если это явно попросить - if(number > 17, 10, (a+b/c) as number) Можно сделать 1000 раз with/without AS и сравнить.

Витя-Сергеев Автор вопроса
Boris
а с чего бы это оно вычисляется два раза? Вы прове...

не проверял, не придемал как проверить, отсюда и вопрос был, но ответ нашелся проще, мне нужно было просто меньшее число и подошла функция least

Ildar Garaev
точно не везде. Postgres по моему матерелизует wit...

PostgreSQL начиная с версий 12.х материализует WITH только при явном добавлении указания MATERIALIZED. Поведение по умолчанию же — сворачивание WITH в родительский запрос ("инлайнится", грубо говоря). Однако, это стандартное поведение не выполняется в ряде случаев, информация об этом будет доступна в EXPLAIN. Также возможно и принудительное сворачивание через NOT MATERIALIZED. // Это, конечно же, приведено для информации и никак не противоречит вашему утверждению о том, что "точно не везде" ;)

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта