Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
Я конечно не знаю, где человеческий фактор сыграл роль при передачи информации сюда, но я могу предполагать у вас ошибка в примере. Код: sql 1. 2. 3. 4. 5. 6. 7. а вы уверены, что это программист? Сейчас программисты это все подряд, даже грузчик :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 13:30 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
TaPaKРечь идёт о том что передано 2 из 5ти переменных и надо вернуть по двум условиям.Или о том, что нужно так же уметь искать по значениям null. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 13:34 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
SQL2008msLex и не оставить шансов оптимизатору использовать индекс Ну значит изначально делать правильную архитектуру. С архитектурой тут все нормально, просто главным критерием запроса должна быть не "красивость" (сомнительная, кстати), а скорость работы. SQL2008Сейчас работаю с базой, где числовые и временнЫе данные забиты в текстовые поля... Какой прок от оптимизатора в таких случаях? Смешались в кучу... Каким боком это относится к исходной проблеме? Тут нужные данные хранятся в нужном месте и с нужным типом данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 13:44 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
Fochaа вы уверены, что это программист?Я думаю, программист, чей код проверяется, не мог так написать, ибо это вылезет при первом же запуске. И неправильные имена колонок, и NOT ИМХО "не программист" тут явно проверяющий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 13:46 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
msLex Каким боком это относится к исходной проблеме? На текстовое поле настроен индекс с сортировкой. В поле значения 91 908 90 Вы считаете, что применение индекса оптимизатором в данном случае уменьшит стоиомость запроса? Хотя конечно к теме обсуждения это не имеет прямого отношеня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 13:56 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
SQL2008msLex Каким боком это относится к исходной проблеме? На текстовое поле настроен индекс с сортировкой. В поле значения 91 908 90 Вы считаете, что применение индекса оптимизатором в данном случае уменьшит стоиомость запроса? Хотя конечно к теме обсуждения это не имеет прямого отношеня. какое отношение кривость ваших данных имеет к теме обсуждения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 14:02 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
invmTaPaKРечь идёт о том что передано 2 из 5ти переменных и надо вернуть по двум условиям.Или о том, что нужно так же уметь искать по значениям null. значить мой шар не работает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 14:49 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
TaPaKзначить мой шар не работает :)Или мой :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2019, 15:12 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
SQL2008 Код: sql 1. 2. 3. 4. 5. 6. Чушь какая-то... Вы думаете ваша чушь чем то намного лучше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2019, 00:36 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
Ошибка программиста очень простая и поэтому не сразу видна. для всех строчек WHERE нужно убрать "NOT" т.е. получится (f1 = @v1 or @v1 is null) и тогда все работает правильно для любого set ansi_nulls on/off. Код: sql 1. 2. 3. 4. 5. 6. flexgenПрислали мне сегодня код процедуры на проверку, и вижу я нечто вроде такого (имена переменных, полей и таблицы даны для примера): Код: sql 1. 2. 3. 4. 5. 6. Спрашиваю программиста что именно он имел ввиду написав это, получаю ответ - процедура вызывается с пятью параметрами, любой из них может получить значение NULL. Чтобы не проверять какие именно значения получены и не строить динамический SQL, пишут вот такой вот код. Может я чего-то не понимаю, но, как мне кажется, подобный код правильно работать не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2019, 10:36 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
msLexSQL2008... Хотя конечно к теме обсуждения это не имеет прямого отношеня. какое отношение кривость ваших данных имеет к теме обсуждения? Дочитать фразу до конца это особенность вашего характера или психики? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2019, 11:54 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
MindSQL2008 Код: sql 1. 2. 3. 4. 5. 6. Чушь какая-то... Вы думаете ваша чушь чем то намного лучше? Ненамного. Лишь тем, что моя чушь работает, а эта нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2019, 11:59 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
BadgerОшибка программиста очень простая и поэтому не сразу видна. для всех строчек WHERE нужно убрать "NOT" т.е. получится (f1 = @v1 or @v1 is null) и тогда все работает правильно для любого set ansi_nulls on/off.хмм, а как определяется правильность которая нужна программисту? не смущает-ли факт того что результат (в примере: по твоему утверждению - ожидаемо эквивалентных пар a-c и b-d) при разных @v1 и t1 будет отличаться в зависимости от ansi_nulls? https://rextester.com/MFJMM69922 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2019, 12:30 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
точнее пары b-d ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2019, 12:31 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
не, последнее сообщ. явно было лишним, изначально правильно: сравнение результата из пары a-c с парой b-d ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2019, 13:40 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
alexeyvgFochaа вы уверены, что это программист? ИМХО "не программист" тут явно проверяющий. Авто темы, он даже больше ничего не отвечал в тему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2019, 10:44 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
Fochaalexeyvgпропущено... ИМХО "не программист" тут явно проверяющий. Авто темы, он даже больше ничего не отвечал в тему.Угу, некогда, нужно руководить программистами! :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2019, 11:25 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
Focha, не надо ничего доказывать, надо писать тесты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2019, 11:56 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
flexgenПрислали мне сегодня код процедуры на проверку, и вижу я нечто вроде такого (имена переменных, полей и таблицы даны для примера): Код: sql 1. 2. 3. 4. 5. 6. Соответственно, подобный запрос не вернет ничего несмотря на то, что значение первой переменной not null и это значение есть в таблице. Или я ошибаюсь? Полагаю опечатка у вас или у программиста, так программист хотел написать ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2019, 14:56 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
flexgen, А по субж... синтаксически вполне приемлемо этот синтаксис, единственное здесь 100% будет parameter sniffing, для оптимизации или в конец запроса добавлять OPTION(RECOMPILE) или динамический sql все таки делать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2019, 14:57 |
|
||
|
Как объяснить программисту как правильно писать запросы
|
|||
|---|---|---|---|
|
#18+
-- KAB --flexgen, А по субж... синтаксически вполне приемлемо этот синтаксис, единственное здесь 100% будет parameter sniffing, для оптимизации или в конец запроса добавлять OPTION(RECOMPILE) или динамический sql все таки делатьПрочитайте лучше что такое parameter sniffing. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2019, 22:13 |
|
||
|
|

start [/forum/topic.php?all=1&fid=46&tid=1687601]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
32ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
69ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 344ms |

| 0 / 0 |
