|
Не срабатывает условие на вхождение в запросе. | ☑ | ||
---|---|---|---|---|
0
ks_83
26.05.20
✎
14:21
|
Вот так работает:
РегистрНакопления.ДвижениеПродукции.Остатки( , ЗаписьСкладскогоЖурнала В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе)=ЛОЖЬ) Вот так тоже работает: РегистрНакопления.ДвижениеПродукции.Остатки( , НЕ ЗаписьСкладскогоЖурнала В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе)=ИСТИНА) А вот так не работает!(выдает пустой результат) РегистрНакопления.ДвижениеПродукции.Остатки( , НЕ ЗаписьСкладскогоЖурнала В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе)) Кто знает в чем подвох? В профайлеры пока лень лезть. Попробую сначала ТИИ сделать вечером. |
|||
1
Beduin
26.05.20
✎
14:30
|
А у тебя в первых двух условиях ИСТИНА получается. Все ЗаписьСкладскогоЖурнала есть в регистре
|
|||
2
VladZ
26.05.20
✎
14:32
|
(0) Херню пишешь, вот и не работает.
|
|||
3
ks_83
26.05.20
✎
14:33
|
(1) Все 3 условия не отличаются по логике.
|
|||
4
fisher
26.05.20
✎
14:48
|
А так?
РегистрНакопления.ДвижениеПродукции.Остатки( , НЕ (ЗаписьСкладскогоЖурнала В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе))) |
|||
5
ks_83
26.05.20
✎
14:51
|
(2) Это говорит человек, который постит говнокоменты в темах, в которых ничего не смыслит. Ок.
|
|||
6
ks_83
26.05.20
✎
14:55
|
(4) Скобки по разному уже пытался ставить. Не помогло( и слава богу).
|
|||
7
fisher
26.05.20
✎
14:58
|
(6) Согласен :)
Уверен, что запросы, их параметры и окружение ничем не отличаются? Тогда очевидно, что фиг его знает. |
|||
8
ks_83
26.05.20
✎
15:06
|
(7) Запрос один. Просто я меняю в нем условие и получаю разный результат. Хотя результат меняться не должен, ибо условия различаются чисто синтаксически, но не логически.
|
|||
9
1Сергей
26.05.20
✎
15:09
|
Дико извиняюсь. ЗаписьСкладскогоЖурнала - это измерение, ресурс или реквизит регистра?
|
|||
10
ks_83
26.05.20
✎
15:10
|
(9) Измерение, не составное.
|
|||
11
1Сергей
26.05.20
✎
15:13
|
(10) И вид регистра - остатки?
|
|||
12
ks_83
26.05.20
✎
15:15
|
(11) Да.
|
|||
13
palpetrovich
26.05.20
✎
15:24
|
ЗаписьСкладскогоЖурнала -булево что-ли?
я что-то вообще не понимаю что здесь написано: ЗаписьСкладскогоЖурнала В(ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе)=ЛОЖЬ без шуток, просто интересно как это работает |
|||
14
RomanYS
26.05.20
✎
15:26
|
(13) похоже смысл понимать надо так :) :
(ЗаписьСкладскогоЖурнала В(ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе)) = ЛОЖЬ |
|||
15
palpetrovich
26.05.20
✎
15:38
|
мдя, работает как-то, "Да" возвращает:
ВЫБРАТЬ 1 как ЗаписьСкладскогоЖурнала Поместить ВтВпроцессе объединить ВЫБРАТЬ 2 ; ВЫБРАТЬ 3 В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе)=ЛОЖЬ |
|||
16
fisher
26.05.20
✎
15:40
|
(13) Это тоже самое, что и ГДЕ Проведен = ИСТИНА
Тавтология, которая не должна повлиять на результат. Или вопрос про работу оператора "В"? Тогда RTFM. |
|||
17
palpetrovich
26.05.20
✎
15:44
|
(15) только вот есть у автора ЗаписьСкладскогоЖурнала не булево - то чему он удивляется? )
|
|||
18
fisher
26.05.20
✎
15:45
|
(17) Ок. Не хочешь в RTFM, тогда маленький ликбез. Результат работы оператора "В" - булево.
|
|||
19
palpetrovich
26.05.20
✎
15:47
|
(18) да нет, меня смутило "=ложь"
|
|||
20
Ёпрст
26.05.20
✎
15:48
|
(6) конструктором открой, он раставит как надо скобочки
|
|||
21
Ёпрст
26.05.20
✎
15:49
|
(0) посмотри в консоле, че возвращает
НЕ ЗаписьСкладскогоЖурнала В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе) |
|||
22
fisher
26.05.20
✎
15:51
|
(19) У ТС не заработало "НЕ..." и он начал экспериментировать. Внезапно "=ложь" выдало другой результат, хотя логически это одно и то же. И вот он здесь.
|
|||
23
palpetrovich
26.05.20
✎
15:59
|
(22) у ненго НЕ не там
так тоже работает ВЫБРАТЬ 1 как ЗаписьСкладскогоЖурнала Поместить ВтВпроцессе объединить ВЫБРАТЬ 2 ;ВЫБРАТЬ 3 В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе)=Ложь ;ВЫБРАТЬ 3 В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе) ;ВЫБРАТЬ 3 НЕ В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе)=Истина |
|||
24
palpetrovich
26.05.20
✎
16:00
|
+(23) впрочем пофик на место НЕ , чьл "ВЫБРАТЬ 3 НЕ" , что "ВЫБРАТЬ НЕ 3 "
|
|||
25
ks_83
26.05.20
✎
16:05
|
Короче завел в запросе два поля:
НЕ ДвижениеПродукцииОстатки.ЗаписьСкладскогоЖурнала В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе) КАК Поле1, ДвижениеПродукцииОстатки.ЗаписьСкладскогоЖурнала В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе) КАК Поле2 В итоге Поле2 принимает значения как истина так и ложь, Поле 1 ВСЕГДА ПРИНИМАЕТ ЗНАЧЕНИЕ ЛОЖЬ. Вот такое бывает. Первый раз такую дичь наблюдаю. |
|||
26
Ёпрст
26.05.20
✎
16:07
|
(25) битые записи поди в регистре, да ?
|
|||
27
Ёпрст
26.05.20
✎
16:10
|
Выведи, чему равно ДвижениеПродукцииОстатки.ЗаписьСкладскогоЖурнала ..и свои поля, увидишь
|
|||
28
fisher
26.05.20
✎
16:10
|
(25) А так?
ДвижениеПродукцииОстатки.ЗаписьСкладскогоЖурнала НЕ В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе) КАК Поле1, |
|||
29
Ёпрст
26.05.20
✎
16:18
|
Или где-тое есть null
|
|||
30
Ненавижу 1С
гуру
26.05.20
✎
16:18
|
(23) а теперь в исходной таблице оставь одно значение NULL
|
|||
31
fisher
26.05.20
✎
16:21
|
Мимо. "В" - наллоустойчив.
|
|||
32
ks_83
26.05.20
✎
16:25
|
||||
33
Ненавижу 1С
гуру
26.05.20
✎
16:25
|
(31) офигенный вывод
|
|||
34
dezss
26.05.20
✎
16:26
|
(29) В этом и дело, похоже.
Именно "НЕ В" дает такое поведение когда в подзапросе встречается null |
|||
35
dezss
26.05.20
✎
16:28
|
Кому интересно, вот набросал.
ВЫБРАТЬ "1" КАК ЧС ПОМЕСТИТЬ ВТ ОБЪЕДИНИТЬ ВЫБРАТЬ "2" ОБЪЕДИНИТЬ ВЫБРАТЬ "3" ОБЪЕДИНИТЬ ВЫБРАТЬ "4" ОБЪЕДИНИТЬ ВЫБРАТЬ "5" ОБЪЕДИНИТЬ ВЫБРАТЬ "6" ОБЪЕДИНИТЬ ВЫБРАТЬ "8" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Null КАК ЧСНалл ПОМЕСТИТЬ ВТН ОБЪЕДИНИТЬ ВЫБРАТЬ "8" ОБЪЕДИНИТЬ ВЫБРАТЬ "1" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ.ЧС ИЗ ВТ КАК ВТ ГДЕ ВТ.ЧС НЕ В (ВЫБРАТЬ ВТН.ЧСНалл ИЗ ВТН КАК ВТН) |
|||
36
dezss
26.05.20
✎
16:29
|
(35) + убираете null во второй ВТ и все отрабатывает.
|
|||
37
fisher
26.05.20
✎
16:30
|
(33)
ВЫБРАТЬ 1 В (ВЫБРАТЬ NULL) = "Нет" ВЫБРАТЬ НЕ 1 В (ВЫБРАТЬ NULL) = "Да" Или ты про что? |
|||
38
ks_83
26.05.20
✎
16:34
|
Точняк. Именно в виртуальной таблице есть битая строка с NULL-ами! А я и не заметил сначала. Усем спасибо.
|
|||
39
fisher
26.05.20
✎
16:37
|
(30)(35) Опа. А я и не знал.
|
|||
40
fisher
26.05.20
✎
16:41
|
Но у меня на (35) все сабжевые примеры отрабатывают одинаково. Что логично.
|
|||
41
fisher
26.05.20
✎
16:43
|
Стопудово тут еще логика работы виртуальной таблицы подсломалась.
|
|||
42
dezss
26.05.20
✎
16:45
|
(41) Не. Тут, скорей всего, дело в самом sql.
При проверке на вхождение, он ищет такое значение, находит его и все хорошо. А вот если проверяет на НЕвхождение, то сравнивает со всеми записями второй таблицы и спотыкается на сравнении с null. Надо еще несколько проверок сделать. |
|||
43
ks_83
26.05.20
✎
16:46
|
Кому интересно почему при этом работает конструкция
РегистрНакопления.ДвижениеПродукции.Остатки( , НЕ ЗаписьСкладскогоЖурнала В (ВЫБРАТЬ ВтВпроцессе.ЗаписьСкладскогоЖурнала ИЗ ВтВпроцессе)=ИСТИНА) На скуле это выглядит как WHERE ((T2.ОбластьДанныхОсновныеДанные = ?)) AND (T2.Период = ? AND ((NOT (((CASE WHEN (T2.ЗаписьСкладскогоЖурнала IN (SELECT T3._Q_001_F_000RRef AS Q_001_F_000RRef FROM ВременнаяТаблица40 T3 WITH(NOLOCK))) THEN 0x01 ELSE 0x00 END = 0x01))))) AND (T2.Количество <> ?) AND (T2.Количество <> ?)) т.е здесь NOT применяется не к IN, а к CASE Если убрать "=ИСТИНА", то будет просто WHERE ((T2.ОбластьДанныхОсновныеДанные = ?)) AND (T2.Период = ? AND ((NOT ((T2.ЗаписьСкладскогоЖурнала IN (SELECT T3._Q_001_F_000RRef AS Q_001_F_000RRef FROM ВременнаяТаблица40 T3 WITH(NOLOCK)))))) AND (T2.Количество <> ?) AND (T2.Количество <> ?)) и на этом все ломается. |
|||
44
dezss
26.05.20
✎
16:55
|
(43) В общем, исключай null-ы из подзапроса. Нехорошо с ним сравнивать)))
|
|||
45
fisher
26.05.20
✎
16:57
|
Прикольная фича
|
|||
46
ks_83
26.05.20
✎
17:02
|
(38) Пардоньте, во временной таблице,а не в виртуальной. В виртуальной все норм.
(44) В моем случае null-ы появились из-за косяка в БД, поэтому надо делать ТИИ. |
|||
47
1Сергей
26.05.20
✎
17:04
|
Ёпрст как всегда быстрее всех протелепатил
|
|||
48
Ненавижу 1С
гуру
26.05.20
✎
17:10
|
да нет, тут помимо NOT IN вполне задокументированного поведением SQL сама 1С начудачила
Внимание запрос: ВЫБРАТЬ ВЫРАЗИТЬ(NULL КАК ЧИСЛО(10,0)) как Поле Поместить Таблица1 ; ВЫБРАТЬ NULL как Поле Поместить Таблица2 ; ВЫБРАТЬ ТИПЗНАЧЕНИЯ(3 В (ВЫБРАТЬ Поле ИЗ Таблица1)), (3 В (ВЫБРАТЬ Поле ИЗ Таблица1)), (3 НЕ В (ВЫБРАТЬ Поле ИЗ Таблица1)), (3 В (ВЫБРАТЬ Поле ИЗ Таблица1) = ЛОЖЬ), НЕ (3 В (ВЫБРАТЬ Поле ИЗ Таблица1)), ТИПЗНАЧЕНИЯ(3 В (ВЫБРАТЬ Поле ИЗ Таблица2)), (3 В (ВЫБРАТЬ Поле ИЗ Таблица2)), (3 НЕ В (ВЫБРАТЬ Поле ИЗ Таблица2)), (3 В (ВЫБРАТЬ Поле ИЗ Таблица2) = ЛОЖЬ), НЕ (3 В (ВЫБРАТЬ Поле ИЗ Таблица2)) |
|||
49
Ненавижу 1С
гуру
26.05.20
✎
17:39
|
+(48) проанализировав профайлер: 1С криво строит запрос с нетипизированным NULL
|
|||
50
Ненавижу 1С
гуру
26.05.20
✎
22:04
|
то же самое иначе:
ВЫБРАТЬ КОЛИЧЕСТВО(1) КАК Поле1 ГДЕ НЕ 1 В (ВЫБРАТЬ ВЫРАЗИТЬ(NULL КАК ЧИСЛО(10, 0))) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ КОЛИЧЕСТВО(1) ГДЕ НЕ 1 В (ВЫБРАТЬ NULL) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |