Имя: Пароль:
1C
1C 7.7
v7: 1SQLite: Помогите с запросом? Ругается на скобку...
0 Zhuravlik
 
13.02.13
16:54
Злравствуйте. Хочу в запросе получать все даты из периода, и пустые даты.
Запрос идет по двум справочникам, "_ТТН_База_ДанныеТТН" подчинен "_ТТН_База_Перевозки". Дата принадлежит подчиненному, т.е.
ВЫБРАТЬ ...
КОГДА (Проверяю реквизит владельца) И
/*у подчиненных*/ ((проходит условие на дату) ИЛИ (есть пустая дата))
И (Проверяю владельца).
Пустую дату проверяю по LIKE, если в первом символе нет цифр - значит дата пуста.
А тут ругается мне на скобку, уже пооблазил весь код, вроде все правильно, не пойму...



SELECT
   Рейсы.флЗапретРедактирования as [Запрет],
   Рейсы.Контрагент    as [Контрагент $Справочник.Контрагенты],
   Рейсы.ID            as [Ссылка $Справочник._ТТН_База_Перевозки],
   Рейсы.Автовоз        as [Автовоз],
   Рейсы.Водитель        as [Водитель $Справочник.Сотрудники],
   Рейсы.Маршрут        as [Маршрут $Справочник.АВТ_Маршрут],
   Рейсы.Путевой_Номер    as [Путевой_Номер],
   Рейсы.Путевой_Дата    as [Путевой_Дата $Дата],
   Рейсы.ДатаУбытия    as [ДатаУбытия $Дата],
   Рейсы.ДатаПрибытия    as [ДатаПрибытия $Дата],
   Рейсы.Сумма            as [Сумма],
   Рейсы.Километраж    as [Километраж],
   Рейсы.ДанныеТТН        as [ДанныеТТН]
FROM
   [Справочник._ТТН_База_Перевозки] as [Рейсы]

WHERE (Рейсы.Статус = @Статус) AND  exists (
           SELECT *
           FROM [Справочник._ТТН_База_ДанныеТТН] as [ТТН]
           WHERE  (ТТН.ДатаТТН between @НачДата AND @КонДата) OR (ТТН.ДатаТТН LIKE [!'0123456789']%)
           AND (ТТН.PARENTEXT = Рейсы.ID)
           )
GROUP BY Рейсы.Контрагент, Рейсы.ID, Рейсы.Автовоз, Рейсы.Водитель,
Рейсы.Маршрут, Рейсы.Путевой_Номер, Рейсы.Путевой_Дата, Рейсы.ДатаУбытия,
Рейсы.ДатаПрибытия, Рейсы.Сумма, Рейсы.Километраж, Рейсы.ДанныеТТН
ORDER BY Рейсы.ДатаУбытия
1 ДенисЧ
 
13.02.13
16:56
(ТТН.ДатаТТН LIKE [!'0123456789']%)

мне это подозрительно
2 Zhuravlik
 
13.02.13
16:57
(1) Если первый символ не являетсяодним из..., нет?
3 Rie
 
13.02.13
16:57
(0) Образец - это строка. А у тебя кавычки несколько не там стоят...
4 orefkov
 
13.02.13
16:58
Да, LIKE подозрительный какой-то.
Вообще не пойму его.
5 Zhuravlik
 
13.02.13
17:02
LIKE - отсюда взял http://www.w3schools.com/sql/sql_wildcards.asp, или в SQLite так нельзя?
6 Zhuravlik
 
13.02.13
17:03
+
Next, we want to select the persons with a last name that do not start with "b" or "s" or "p" from the "Persons" table.

We use the following SELECT statement:
SELECT * FROM Persons
WHERE LastName LIKE '[!bsp]%'
7 orefkov
 
13.02.13
17:03
(2)
Ты LIKE с регэкспами спутал наверное.
Вот на http://www.sqlite.org/lang_expr.html написано:
"The operand to the right of the LIKE operator contains the pattern and the left hand operand contains the string to match against the pattern. A percent symbol ("%") in the LIKE pattern matches any sequence of zero or more characters in the string. An underscore ("_") in the LIKE pattern matches any single character in the string. Any other character matches itself or its lower/upper case equivalent (i.e. case-insensitive matching)."

Работают только
% - любой символ 0 или более раз
_ - один любой символ
Остальное сравнивается как есть.
8 orefkov
 
13.02.13
17:04
И весь паттерн для LIKE должен быть строкой в одинарных кавычках.
9 Rie
 
13.02.13
17:05
(5) Посмотри внимательно, как образец LIKE в твоей ссылке записан.
10 orefkov
 
13.02.13
17:05
В sqlite есть оператор REGEXP, но он вызывает пользовательскую функцию, которая по-дефолту ничего не ищет. Можно поискать расширение для sqlite, с реализацией REGEXP.
11 Rie
 
13.02.13
17:10
Если я правильно понял автора, то LIKE '[^0-9]%' даст искомый результат.
12 Zhuravlik
 
13.02.13
17:10
(9) Я уже попробовал вместо <[!'0123456789']> искать <'[!0123456789]'> - запрос ошибок не выдает, но и данных нет)
(10) т.е. я сам могу SQLite обновлять?
А вообще так проавильно проверять на дату?
(11) Долго писал)
13 Zhuravlik
 
13.02.13
17:10
А, там еще ^
14 Rie
 
13.02.13
17:12
(12) Так а хрен знает, что тебе надо было. Я предполагаю, что человек, пишущий на SQL, предварительно ознакомился с этим языком :-)
15 orefkov
 
13.02.13
17:15
(12)
Давай завтра попробую сделать.
16 Zhuravlik
 
13.02.13
17:18
(14) Ды это я долго писал))))
Ваш вариант аналогичен моему, <'[!0123456789]%'>, но ни с тем ни с другим условие не проходит, в запросе - 0 строк, а пустые даты есть точно, проверил.
А как еще можно на пустую дату проверить? Я просто столкнулся еще вот с чем: Когда делаю просто запрос без условия, в результирующую таблицу дата (если пустая) выгружается как "  .  .  ", и условие на пустоеЗначение потом не проходит, я подумал что и в самом запросе будет так же, отсюда взялся LIKE. Может как-то по-другому нужно?
(15) Давайте)
17 orefkov
 
13.02.13
17:25
На пустую дату в запросе надо проверять так:
поле<>'        '
18 Zhuravlik
 
13.02.13
17:29
(17) Все получилось! Спасибо!)
19 Zhuravlik
 
13.02.13
17:34
(17) Теперь не будете REGEXP вставлять?
20 orefkov
 
13.02.13
17:47
Почему же, надо будет попробовать.
Все равно для 8ки надо 1sqlite надо делать.
21 Ёпрст
 
13.02.13
17:54
(20) давно пора
22 Zhuravlik
 
13.02.13
18:10
Что-то не то у меня снова...
Когда запрос проходит без доп. условия на пустую дату - выводится 25 элементов, с этим уловием - 32. Только в добавленных семи дата непустая, и не входит в период фильтра.
Это если я на exists в подчиненном справочнике ищу.
А если в одной таблице фильтрую по дате, то все работает как надо.

Вот текст из отладки:

SELECT
   Рейсы.флЗапретРедактирования as [Запрет],
   Рейсы.Контрагент    as [Контрагент $Справочник.Контрагенты],
   Рейсы.ID            as [Ссылка $Справочник._ТТН_База_Перевозки],
   Рейсы.Автовоз        as [Автовоз],
   Рейсы.Водитель        as [Водитель $Справочник.Сотрудники],
   Рейсы.Маршрут        as [Маршрут $Справочник.АВТ_Маршрут],
   Рейсы.Путевой_Номер    as [Путевой_Номер],
   Рейсы.Путевой_Дата    as [Путевой_Дата $Дата],
   Рейсы.ДатаУбытия    as [ДатаУбытия $Дата],
   Рейсы.ДатаПрибытия    as [ДатаПрибытия $Дата],
   Рейсы.Сумма            as [Сумма],
   Рейсы.Километраж    as [Километраж],
   Рейсы.ДанныеТТН        as [ДанныеТТН]
FROM
   [Справочник._ТТН_База_Перевозки] as [Рейсы]

WHERE (Рейсы.Статус = @Статус) AND
exists (
       SELECT *
       FROM [Справочник._ТТН_База_ДанныеТТН] as [ТТН]
       WHERE ( (ТТН.ДатаТТН between @НачДата AND @КонДата) OR (ТТН.ДатаТТН = '        ') AND (ТТН.PARENTEXT = Рейсы.ID)
       ))
GROUP BY Рейсы.Контрагент, Рейсы.ID, Рейсы.Автовоз, Рейсы.Водитель,
Рейсы.Маршрут, Рейсы.Путевой_Номер, Рейсы.Путевой_Дата, Рейсы.ДатаУбытия,
Рейсы.ДатаПрибытия, Рейсы.Сумма, Рейсы.Километраж, Рейсы.ДанныеТТН
ORDER BY Рейсы.ДатаУбытия

Где-то в условии у меня косяк?
23 Zhuravlik
 
13.02.13
18:17
Кажется понял
((ТТН.ДатаТТН between @НачДата AND @КонДата) OR (ТТН.ДатаТТН = '        ')) AND (ТТН.PARENTEXT = Рейсы.ID)