Оригинал на GitHub
Вопрос
Не могу понять почему не работает следующий код. Помогите разобраться.
=: setList(table: 'main_table'; field: 'status' = 5; where: cond`'date' < $#nd && 'status' != 5`; log: true)
Ответ
Дело в том, что синтаксическая конструкция cond
не работает в where параметрах функций. В where может быть использована специальная конструкция qrow
, которая позволяет задать различные условия поиска для БД.
=: select(table: $#ntn; field: 'id'; where: qrow`'field_1' > 100 || 'field_2' = true`)
qrow
поддерживает операторы:
&&
— И
||
— ИЛИ
()
— группировка
Операторы сравнения аналогичны операторам остальной системы.
Name-параметры указываются в одинарных кавычках 'field_1'
В сравнении 'field_1' > 100
обязательно должен быть использован один name-параметр.
Name-параметры могут быть использованы в обоих сторонах сравнения 'field_1' > 'field_2'
— выбрать строки где field_1
> field_2
.
Пример с группировкой:
=: select(table: $#ntn; field: 'id'; where: qrow`'(field_1' > 100 && 'field_3' = true) || 'field_2' = true`)
field_1
больше 100 и field_3
= true или field_2 равно true
На одном уровне операторы должны быть одинаковыми!
Вместе с qrow может быть использовано несколько where
, они работают в режиме И
:
=: select(table: $#ntn; field: 'id'; where: qrow`'(field_1' > 100 && 'field_3' = true) || 'field_2' = true`; where: 'filed_4' = false)
(field_1
больше 100 и field_3
= true или field_2
равно true) и filed_4
= false
Если у вас в сравнениях используется id
в режиме И
то запрос будет исполняться сильно быстрее, если поставить это условие в отдельный where вперед
=: select(table: $#ntn; field: 'id'; where: 'id' != #id; where: qrow`'(field_1' > 100 && 'field_3' = true) || 'field_2' = true`)
id
не равно id текущей строки и (field_1
больше 100 и field_3 = true
или field_2
равно true)
В вашем случае код с qrow будет выглядеть так:
=: setList(table: 'main_table'; field: 'status' = 5; where: qrow`'date' < $#nd && 'status' != 5`; log: true)
Но для таких простых условий лучше использовать несколько параметров where:
=: setList(table: 'main_table'; field: 'status' = 5; where: 'date' < $#nd; where: 'status' != 5; log: true)