Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
Прислали мне сегодня код процедуры на проверку, и вижу я нечто вроде такого (имена переменных, полей и таблицы даны для примера): Код: sql 1. 2. 3. 4. 5. 6. Спрашиваю программиста что именно он имел ввиду написав это, получаю ответ - процедура вызывается с пятью параметрами, любой из них может получить значение NULL. Чтобы не проверять какие именно значения получены и не строить динамический SQL, пишут вот такой вот код. Может я чего-то не понимаю, но, как мне кажется, подобный код правильно работать не будет. Допустим, переменная @v1 получила not null значение и такое значение имеется в поле f1, остальные - null. Тогда получается: Код: sql 1. 2. 3. 4. 5. Соответственно, подобный запрос не вернет ничего несмотря на то, что значение первой переменной not null и это значение есть в таблице. Или я ошибаюсь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 21:23 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
flexgen, ничего необычного в таком подходе программиста нет (если именно такая бизнес-логика), строишь таблицу истинности (конъюнктивная {нормальная} форма) и проверяешь, например если следовать твоему сценарию и {@v2~@v5} = null and {f2~f3} = null то и все условия после первого f2=@v2 будут null=null , т.е. true (максимальный индекс у f = 3, даже если ошибка - то не так важно для примера) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 21:39 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
другое дело что именно в таком на T-SQL null=null вовсе не true ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 21:44 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
в смысле в таком .. виде (пропустил) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 21:45 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
блин, вот туплю, есть-же ведь: SET ANSI_NULLS OFF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 21:50 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
flexgenИли я ошибаюсь?Не ошибаетесь. Требуемое можно написать так Код: sql 1. 2. 3. 4. 5. 6. 7. При таком способе еще и индекс может быть задействован для поиска. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 22:01 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
invmflexgenСоответственно, подобный запрос не вернет ничего несмотря на то, что значение первой переменной not null и это значение есть в таблице. Или я ошибаюсь?Не ошибаетесь.не согласен (кроме как про индекс), я с горяча в панике что накосячил - уже несколько раз перепроверил если через подмену то матемитически получится (при fn {n>1} = null и @vn {n>1} = null) (1 = 1 or 1) &(null = null or 0) &(null = null or 0) &(null = null or 0) &(null = null or 0) что преобразовывается в (1 = 1 or 1) = true &(1 or 0) = true &(1 or 0) = true &(1 or 0) = true &(1 or 0) = true откуда результат = true т.е. при разных значениях fn (где часть = null) будет работать фильтрация ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 22:11 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
vikkiv, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 22:22 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
invm, https://rextester.com/EMHCV18362 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 22:46 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
в смысле тавтология конечно но: в разных конструкциях в разных местах будет работать по разному с разными настройками ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2019, 22:47 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
invmflexgenИли я ошибаюсь?Не ошибаетесь. Требуемое можно написать так Код: sql 1. 2. 3. 4. 5. 6. 7. При таком способе еще и индекс может быть задействован для поиска. Класс какой! Интересно, какой план даст. В любом случае, спасибо. Изящно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 09:25 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
vikkiv Код: sql 1. 1. За такое как минимум лишают премии, а как максимум сразу увольняют - в назидание оставшимся. 2. В этом случае проверять переменные на null не требуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 09:28 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
flexgenСоответственно, подобный запрос не вернет ничего несмотря на то, что значение первой переменной not null и это значение есть в таблице. Или я ошибаюсь?Не ошибаетесь Но вы неправильно переписали запрос. На самом деле: Код: sql 1. 2. 3. 4. 5. 6. PS Удивительно, как компании случайным образом расставляют проверяющих и проверяемых :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 09:52 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
alexeyvgНо вы неправильно переписали запрос.Не факт. Не сказано, что null в параметре означает исключение соответствующего столбца из фильтра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 10:06 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
flexgen, в общем, как уже сказали вариант "f1 = @v1 or @v1 is not null" неправильный, должен быть "f1 = @v1 or @v1 is null " ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 10:30 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
StarikNavyflexgen, в общем, как уже сказали вариант "f1 = @v1 or @v1 is not null" неправильный, должен быть "f1 = @v1 or @v1 is null " и в конце запроса еще и option (recompile) :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 11:18 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
alexeyvg, +1 к is null иначе запрос будет возвращать все содержимое таблицы если все исходные параметры не NULL => нет смысла проверки на равенство invm, изящно, спасибо Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 12:26 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
vikkiv Код: sql 1. Я один не въезжаю в сакральный смысл этой конструкции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 12:28 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
invmflexgenИли я ошибаюсь?Не ошибаетесь. Требуемое можно написать так Код: sql 1. 2. 3. 4. 5. 6. 7. При таком способе еще и индекс может быть задействован для поиска. это вообще к чему? Речь идёт о том что передано 2 из 5ти переменных и надо вернуть по двум условиям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 12:43 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
aleks222, в рамках set ansi_nulls off задача имеет смысл Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 12:43 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
iiyama, авторв рамках set ansi_nulls off задача имеет смысл в рамках психбольницы в которую попадут те кто будет искать какого же хрена.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 12:46 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. Чушь какая-то... Если нужно исключить параметры, которые NULL из критерия запросов, то я использую схему Код: sql 1. 2. 3. 4. Косяк будет если в таблице в этих полях будет тоже NULL Тогда чуть допилим запрос Код: sql 1. 2. 3. 4. P.S. Сравнение NULL = NULL лучше не включать никогда. Можно поймать огромных проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 13:00 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
TaPaKiiyama, авторв рамках set ansi_nulls off задача имеет смысл в рамках психбольницы в которую попадут те кто будет искать какого же хрена.... +100 500 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 13:01 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
SQL2008 Код: sql 1. 2. 3. 4. 5. 6. Чушь какая-то... Если нужно исключить параметры, которые NULL из критерия запросов, то я использую схему Код: sql 1. 2. 3. 4. Косяк будет если в таблице в этих полях будет тоже NULL Тогда чуть допилим запрос Код: sql 1. 2. 3. 4. P.S. Сравнение NULL = NULL лучше не включать никогда. Можно поймать огромных проблем. и не оставить шансов оптимизатору использовать индекс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 13:11 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
msLex и не оставить шансов оптимизатору использовать индекс Ну значит изначально делать правильную архитектуру. Сейчас работаю с базой, где числовые и временнЫе данные забиты в текстовые поля... Какой прок от оптимизатора в таких случаях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 13:22 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39828010&tid=1687601]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
25ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 346ms |

| 0 / 0 |
