Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 [2] 3 вперед Ctrl→ все |
SomewhereSomehow Member Откуда: Moscow Сообщений: 2480 Блог |
SomewhereSomehow, group by all <-- all можно убрать, остался от эксперимента |
30 ноя 12, 13:31 [13555584] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
SomewhereSomehow, не знаю, как сработает "max()" и "<=" если часть полей будут текстовыми... надо попробовать |
30 ноя 12, 13:39 [13555665] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
TJ001, как быть в таком случае? DECLARE @Table2 table (ID2 int, Val2 int, val3 int, val4 char(3)) INSERT @Table2 values(1,1,0,' 0 ') INSERT @Table2 values(1,1,0,' 0 ') INSERT @Table2 values(2,5,1,' 0 ') INSERT @Table2 values(2,5,0,' 0 ') INSERT @Table2 values(3,8,1,' 0 ') INSERT @Table2 values(5,5,6,' 4 ') INSERT @Table2 values(5,5,5,' 0 ') INSERT @Table2 values(6,5,3,' 0 ') declare @val3 int, @val4 char(3); set @val3 = 5; set @val4 = ' 4 '; |
30 ноя 12, 13:46 [13555724] Ответить | Цитировать Сообщить модератору |
SomewhereSomehow Member Откуда: Moscow Сообщений: 2480 Блог |
Ну вот, появились текстовые поля, еще кусочек задачи всплыл. Текст и числа сравниваются по-разному if 10 > 2 select 'true' else select 'false' if '10' > '2' select 'true' else select 'false' Давайте еще добавим условие "на-ходу", а что если там будет лежать строка в xml, которую нужно совсем по особенному сравнивать? Или text? Видимо моя просьба обратить внимание на рекомендацию описать задачу целиком, была проигнорирована... |
||
30 ноя 12, 14:21 [13555996] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
SomewhereSomehow, ну не пинайте меня так сразу))) там могут быть только текстовые и числовые поля NULL в них не бывает, обязательно что-то есть если поле текстовое то "пустое" значение - ' 0 ' либо число - 0, других не бывает |
30 ноя 12, 15:09 [13556457] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
@EmptyID varchar(9) SET @EmptyID = ' 0 ' |
||
30 ноя 12, 15:10 [13556463] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
TJ001, как склеить все воедино? |
30 ноя 12, 15:11 [13556468] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
В текстовых полях могут быть цифры и латинские буквы |
30 ноя 12, 15:35 [13556698] Ответить | Цитировать Сообщить модератору |
HandKot Member Откуда: Sergiev Posad Сообщений: 3015 |
TJ001, и что Вы хотите получить при добавлении условия по второму полю? |
1 дек 12, 18:46 [13562060] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
Результат должен быть тот же ид2=1 (потому что все значения val3 = 0, т.е. "пусто", значит у объекта фильтр не задан, для val4 та же ситуация) ид2=5 (потому что @val3=5 и это является одним из значений в поле val3, @val4 так же является одним из значений поля val4 внутри этого же ид2) понимаю, что это сложновато для восприятия, но как еще объяснить я не знаю... т.е. если какие-то моменты я пропустил сразу, это не от лени и не от того, что я игнорирую правила и не ценю ваше время, просто не придал значения, т.к. для моего варианта запроса неважно сколько полей и какого они типа... спасибо, что занимаетесь моим вопросом! очень надеюсь на удачный исход |
3 дек 12, 10:00 [13566736] Ответить | Цитировать Сообщить модератору |
HandKot Member Откуда: Sergiev Posad Сообщений: 3015 |
как вариантDECLARE @Table1 table (ID int, Val int) INSERT @Table1 values(1,5) INSERT @Table1 values(2,8) INSERT @Table1 values(3,10) INSERT @Table1 values(4,7) INSERT @Table1 values(5,0) INSERT @Table1 values(6,4) INSERT @Table1 values(7,4) DECLARE @Table2 table (ID2 int, Val2 int, val3 int, val4 char(3)) INSERT @Table2 values(1,1,0,' 0 ') INSERT @Table2 values(1,1,0,' 0 ') INSERT @Table2 values(2,5,1,' 0 ') INSERT @Table2 values(2,5,0,' 0 ') INSERT @Table2 values(3,8,1,' 0 ') INSERT @Table2 values(5,5,6,' 4 ') INSERT @Table2 values(5,5,5,' 0 ') INSERT @Table2 values(6,5,3,' 0 ') declare @val3 int, @val4 char(3); set @val3 = 5; set @val4 = ' 4 '; declare @param1 int = 5 declare @param2 char(3) = ' 4 ' select * from @Table1 t1 left join ( select t.ID2 from @Table2 t group by t.ID2 having sum(case when val3 = 0 then 0 else 1 end) * min(case when val3 = @param1 then 0 else 1 end) > 0 or sum(case when val4 = ' 0 ' then 0 else 1 end) * min(case when val4 = @param2 then 0 else 1 end) > 0 ) t2 on t2.ID2 = t1.ID where t2.ID2 is null по этому же принципу, можно нарацивать любое кол-во проверок |
3 дек 12, 10:10 [13566790] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
спасибо! буду разбираться))) |
3 дек 12, 10:13 [13566807] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
HandKot, чет не въеду, для чего нужны @param1,2? |
3 дек 12, 10:18 [13566824] Ответить | Цитировать Сообщить модератору |
HandKot Member Откуда: Sergiev Posad Сообщений: 3015 |
это клоны Ваших @val3 и @val4 если не нравится - замените на Ваши обозначения |
3 дек 12, 10:21 [13566832] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
HandKot, т.е. case when val3 = @param1 then 0 else 1 end можно заменить на nullif(val3,@val3) ???? |
3 дек 12, 10:24 [13566846] Ответить | Цитировать Сообщить модератору |
HandKot Member Откуда: Sergiev Posad Сообщений: 3015 |
нет нельзя у меня возвращается 0, nullif вернет null |
||
3 дек 12, 10:25 [13566855] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
это эквивалентно?case when val3 = @val3 then 0 else 1 end отрицательных значений нет, но на всякий случай спрашиваю, как поведет себя запрос если будут, нужно будет что-то переделывать? |
3 дек 12, 10:32 [13566894] Ответить | Цитировать Сообщить модератору |
HandKot Member Откуда: Sergiev Posad Сообщений: 3015 |
да, и пофигу какие значения, отрицательные или нет и даже пофиг на нул и не нул думаю, переделывать не надо будет |
||
3 дек 12, 10:35 [13566909] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
благодарю!) |
3 дек 12, 10:38 [13566922] Ответить | Цитировать Сообщить модератору |
HandKot Member Откуда: Sergiev Posad Сообщений: 3015 |
рано и, как всегда, когда все кажется, что всё в шоколаде, читаем текст, написанный маленькими буковками "вся ответственность за.... лежит на Вас" |
||
3 дек 12, 10:41 [13566947] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
спасибо как минимум за то, что уделяете мне время!) и еще, в своем запросе час назад заметил баг, он выводит правильный результат только когда сочетания "явно указанных" значения находятся в одной строке, если их разнести по разным, то условие уже не выполняется, а должно для set @val3 = 5; set @val4 = ' 4 '; --такой вариант записей мой запрос пропускает, т.е. не выбирает INSERT @Table2 values(5,5,6,' 4 ') INSERT @Table2 values(5,5,5,' 0 ') --а в этом отрабатывает корректно INSERT @Table2 values(5,5,5,' 4 ') INSERT @Table2 values(5,5,6,' 0 ') однако, в Вашем варианте все правильно срабатывает!))) |
3 дек 12, 11:17 [13567186] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
HandKot, на случай, если не передали параметр, т.е. он равен "пустому" значению, условие должно выполняться для всех тогда, если я правильно понял, будет так sum(case when val3 = 0 then 0 else 1 end) * min(case when val3 = @val3 then 0 else 1 end) * min(case when @val3 = 0 then 0 else 1 end) > 0 ? |
3 дек 12, 11:44 [13567378] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
или такsum(case when val3 = 0 or @val3 = 0 then 0 else 1 end) * min(case when val3 = @val3 then 0 else 1 end) > 0 |
3 дек 12, 11:48 [13567421] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
это для того чтобы не приходилось менять текст запроса в зависимости от того передали параметр или нет |
3 дек 12, 11:54 [13567466] Ответить | Цитировать Сообщить модератору |
HandKot Member Откуда: Sergiev Posad Сообщений: 3015 |
да, так пойдет |
||
3 дек 12, 11:58 [13567505] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: ←Ctrl назад 1 [2] 3 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |