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

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

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

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

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

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

14 ответов

59 просмотров

вообще если 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. // Это, конечно же, приведено для информации и никак не противоречит вашему утверждению о том, что "точно не везде" ;)

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

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

Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
10
Тут кста кто-нибудь NeoVim использует?
Simple Sorcerer
13
А чем вам питонисты не угодили?😂
.
79
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
52
А дальше что?.. Записать в файл, потом в Код?.. И потом разбирать как-то?..
Хаскель Моисеевич Гопник
14
доброго времени. db, dw и прочие исполняются при трансляции или при выполнении программы?
lutayyy
10
Почему никто не подсказал, что можно объявить свои типы данных, в которых меньше полей, чем в отданном джейсоне, и добавлять их по необходимости?
Strange Rabbit
10
Хтось використовував Vapor на Windows?
Jaroshevskii
15
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
86
Карта сайта