|
v7: 1c++, помогите с запросом | ☑ | ||
---|---|---|---|---|
0
Skom
06.08.14
✎
13:57
|
|SELECT
| Выборка.ИД as ИД, | Выборка.Код as Код, | Выборка.Наименование as Наименование, |--срок действия |CASE Выборка.СрокДействияНев | WHEN '17530101' THEN Выборка.СрокДействия | ELSE Выборка.СрокДействияНев | END as СрокДействия |FROM ( | Select | Кошелек.ID as ИД, | Кошелек.CODE as Код, | Кошелек.DESCR as Наименование, | $Кошелек.Топливо as Топливо, | $Кошелек.ТипЛимита as ТипЛимита, | $Кошелек.Лимит as Лимит, | $Кошелек.СрокДействия as СрокДействия, | $ПоследнееЗначение._кошелькиТоплив.СрокДействияНев(Кошелек.ID, :ВыбДата) as СрокДействияНев | FROM | $Справочник._кошелькиТоплив as Кошелек (NoLock) | WHERE | Кошелек.ParentExt = ?ВыбВладелец(14,9) | ) as Выборка |"; |
|||
1
Ёпрст
06.08.14
✎
13:57
|
Помогаю, это не снеговик.
|
|||
2
Skom
06.08.14
✎
13:57
|
Вот этот блок не отрабатывает как мне надо
|CASE Выборка.СрокДействияНев | WHEN '17530101' THEN Выборка.СрокДействия | ELSE Выборка.СрокДействияНев | END as СрокДействия |
|||
3
ДенисЧ
06.08.14
✎
13:58
|
"Кошелек.ParentExt = ?ВыбВладелец(14,9)"
Это что за конструкция?? (2) Напиши его так, чтобы отрабатывал как надо... |
|||
4
Skom
06.08.14
✎
13:58
|
(1) ну елы палы. ну ошибся секцией, с кем не бывает)
В общем вопрос такой, если в периодических реквизитах НЕТ записи с датой, то вернется null или вернется пустая дата? |
|||
5
Skom
06.08.14
✎
13:59
|
(3) параметризированный запрос это
|
|||
6
ДенисЧ
06.08.14
✎
14:00
|
(4) а с чего она должна вернуться пустой?
|
|||
7
Skom
06.08.14
✎
14:01
|
Изначально было
|CASE Выборка.СрокДействияНев | WHEN NULL THEN Выборка.СрокДействия | ELSE Выборка.СрокДействияНев | END as СрокДействия но так тоже не работает |
|||
8
Ёпрст
06.08.14
✎
14:01
|
(4) ну есжели сумневаешься, воткни case isnull (Выборка.СрокДействияНев,'17530101')
|
|||
9
Skom
06.08.14
✎
14:02
|
мне не важно на что проверять, важно то, что ни с одним из вариантов не прокатило.
|
|||
10
Skom
06.08.14
✎
14:03
|
делаю проверку и на null и на '17530101', т.е. на пустую дату.
ни так ни так не работает. СрокДействия = 31.12.2015 СрокДействияНев - нет такой даты, в любом варианте выдает пустую дату |
|||
11
Ёпрст
06.08.14
✎
14:04
|
СрокДействияНев - rfrjuj [jnm nbgf nj gthbjlbxtcrbq htrdbpbn &
njxyj lfnf nj & |
|||
12
Skom
06.08.14
✎
14:12
|
э
|
|||
13
Андрюха
06.08.14
✎
14:13
|
СрокДействияНев - какого хоть типа то периодический реквизит ?
точно дата? |
|||
14
mikecool
06.08.14
✎
14:16
|
(10) пустая дата точно без времени?
|
|||
15
MrKartez
06.08.14
✎
14:19
|
думал, что 1с++ это стеб какой-то :D
|
|||
16
Skom
06.08.14
✎
14:35
|
(14) да, там нет времени. типа ДАТА
|
|||
17
Skom
06.08.14
✎
14:35
|
оба реквизита тип ДАТА
|
|||
18
mikecool
06.08.14
✎
14:36
|
(16) я про то, как пустая дата отображается в скуле, может надо нули во время записать, что бы совпадала
|
|||
19
Skom
06.08.14
✎
14:36
|
(15) мало ты повидал еще)
|
|||
20
mikecool
06.08.14
✎
14:37
|
а синтаксис кейса точно такой?
|
|||
21
Skom
06.08.14
✎
14:37
|
(18) '17530101' - пустая дата в скуле
|
|||
22
Skom
06.08.14
✎
14:37
|
такой.
|
|||
23
Ёпрст
06.08.14
✎
14:46
|
yf (11),(13) есть ответ ?
|
|||
24
Skom
06.08.14
✎
14:55
|
(23) точно дата, я же написал
|
|||
25
Skom
06.08.14
✎
14:56
|
ну немного промахнулся с номером поста)
|
|||
26
Ёпрст
06.08.14
✎
14:59
|
Ну и такой запрос чего хоть возвращает ?
Select $ПоследнееЗначение._кошелькиТоплив.СрокДействияНев(Кошелек.ID, :ВыбДата) as СрокДействияНев FROM $Справочник._кошелькиТоплив as Кошелек (NoLock) |
|||
27
Ёпрст
06.08.14
✎
15:01
|
и в зависимости от того, чего он возвращает лепи свой case
например так case when Выборка.СрокДействияНев = Вася then Федя else Ваня end as наташа |
|||
28
trad
06.08.14
✎
15:38
|
можно выразить все одним выражением и даже без подзапроса
|
|||
29
trad
06.08.14
✎
15:40
|
|Select
| Кошелек.ID as ИД, | Кошелек.CODE as Код, | Кошелек.DESCR as Наименование, | $Кошелек.Топливо as Топливо, | $Кошелек.ТипЛимита as ТипЛимита, | $Кошелек.Лимит as Лимит, | isnull(nullif($ПоследнееЗначение._кошелькиТоплив.СрокДействияНев(Кошелек.ID, :ВыбДата), {d '1753-01-01'}), $Кошелек.СрокДействия) as СрокДействия |FROM | $Справочник._кошелькиТоплив as Кошелек (NoLock) |WHERE | Кошелек.ParentExt = ?ВыбВладелец(14,9) |
|||
30
trad
06.08.14
✎
15:42
|
(4) если на указанную дату нет значения, то вернется null
|
|||
31
Ёпрст
06.08.14
✎
15:47
|
(29) с nuliff красиво
|
|||
32
Skom
06.08.14
✎
16:34
|
завтра попробую.
мне проще через подзапрос сделать, более читабельно для меня получается. потому как полный текст запроса немного больше чем тот кусок, который я показал. |
|||
33
trad
06.08.14
✎
17:27
|
(32) надо делать не как читабельнее для тебя, а, в первую очередь, как эффективнее с точки зрения плана выполнения запроса с учетом специфики поставщика ТП.
Если эффективно и читабельно одновременно, то гуд. |
|||
34
trad
06.08.14
✎
17:43
|
Специфика ТП в первую очередь заключается в том, что к исходному запросу поставщик дорисовывает top N и условие по КП
А это может повлиять на план выполнения |
|||
35
Skom
07.08.14
✎
05:23
|
(34) Данный код выполняется не часто, потому как этот запрос это третье ТП на форме и оно обновляется не часто. и данных там по 1-2 строке всего.
А вот то ТП, которое обновляется постоянно и автоматически, там да, нужно оптимизировать запросы. Согласен. |
|||
36
Skom
07.08.14
✎
07:54
|
В sql выполняю, тип поля NULL
но все равно не работает как надо |
|||
37
Skom
07.08.14
✎
07:56
|
Select
case vib.d2 when NULL then vib.d1 else vib.d2 end as d3, vib.d1, vib.d2 From ( select Кошелек.sp8718 as d1, ( select top 1 cast(case when c8965_vv.value = ' . . ' then '17530101' else substring(c8965_vv.value, 7, 4) + substring(c8965_vv.value, 4, 2) + substring(c8965_vv.value, 1, 2) end as datetime) from _1sconst as c8965_vv (nolock) where c8965_vv.id = 8965 and c8965_vv.objid = ' DETW1 ' and (c8965_vv.date <= '20140807') order by c8965_vv.date desc, c8965_vv.time desc, c8965_vv.docid desc, c8965_vv.row_id desc ) as d2 FROM sc8721 as Кошелек (NoLock) ) as vib в итоге имею таблицу d1 - NULL d2 - указана дата d3 - NULL |
|||
38
Skom
07.08.14
✎
08:00
|
ах блин. мистика. поставил
case isnull(vib.d2,'17530101') when '17530101' then vib.d1 и все заработало. |
|||
39
trad
07.08.14
✎
09:18
|
(37) с null нельзя сравнивать (точнее можно, только результат сравнения всегда false)
Для null есть только оператор is и две функции isnull, nullif |
|||
40
Skom
07.08.14
✎
09:29
|
я знаю эти операторы, часто ими пользуюсь)
|
|||
41
Дык ё
07.08.14
✎
09:37
|
(40) sure? если бы знал, написал бы
case when vib.d2 is NULL then vib.d1 else vib.d2 end |
|||
42
trad
07.08.14
✎
09:48
|
(41) по задаче вернее будет так
case when vib.d2 is NULL or vib.d2 = '17530101' then vib.d1 else vib.d2 end |
|||
43
Skom
07.08.14
✎
10:03
|
(41) isnull() и is null немного разные...
Каюсь, забыл что надо is null писать(( Один фиг, через $ПоследнееЗначение долго отрабатывает. Придется переписывать немного иначе. |
|||
44
Skom
07.08.14
✎
10:03
|
всем спасибо.
|
|||
45
trad
07.08.14
✎
10:07
|
(43) "Один фиг, через $ПоследнееЗначение долго отрабатывает."
переиндексируй _1sconst |
|||
46
Skom
07.08.14
✎
10:35
|
(45) ты имеешь в виду добавить индекс? или сделать реиндексацию таблицы? если второе, то планы обслуживания с этим справляются
|
|||
47
trad
07.08.14
✎
10:44
|
(46) ок
|
|||
48
Skom
07.08.14
✎
10:57
|
Просто у меня 4 периодических реквизита подобным образом сравниваются. придется переписать на такую конструкцию
(SELECT | Период.objid as objid, | Период.value as Значение | FROM _1SCONST as Период | WHERE | Период.id = 1036 AND | Период.date IN | (SELECT | MAX(Константа.date) | FROM _1SCONST as Константа | WHERE (Константа.date <= :ВыбДата) AND (Константа.id = 1036) AND (Константа.objid = Период.objid)) | ) as Период ON Период.Objid = ОЦВодила.ID |
|||
49
Skom
07.08.14
✎
10:59
|
точнее такую.
|SELECT | а,б,в,г,д,е, | isnull(Период.Значение,"+ПустойИД9+") as Контрагент, | FROM $Справочник.ОЦВодила as ОЦВодила (NoLock) | LEFT JOIN | (SELECT | Период.objid as objid, | Период.value as Значение | FROM _1SCONST as Период | WHERE | Период.id = 1036 AND | Период.date IN | (SELECT | MAX(Константа.date) | FROM _1SCONST as Константа | WHERE (Константа.date <= :ВыбДата) AND (Константа.id = 1036) AND (Константа.objid = Период.objid)) | ) as Период ON Период.Objid = ОЦВодила.ID |
|||
50
Skom
07.08.14
✎
11:00
|
в общем, еще раз спасибо
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |