|
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) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |