Имя: Пароль:
1C
1С v8
Что вернет запрос?
,
0 Азазелло
 
07.06.12
10:03
Не проверяя в консоли запросов, что будет находится в Поле3? И вообще, отработает ли запрос?

ВЫБРАТЬ
   1 КАК Поле
ПОМЕСТИТЬ вт
;

ВЫБРАТЬ
   вт1.Поле КАК Поле1,
   вт2.Поле КАК Поле2,
   ВЫРАЗИТЬ(ЕСТЬNULL(вт2.Поле, """") КАК СТРОКА) КАК Поле3
ИЗ
   вт КАК вт1
       ЛЕВОЕ СОЕДИНЕНИЕ вт КАК вт2
       ПО ИСТИНА
1 Maxus43
 
07.06.12
10:05
а проверить лень?
2 andrewks
 
07.06.12
10:05
не отработает
3 Maxus43
 
07.06.12
10:05
ошибку вернёт
4 Maxus43
 
07.06.12
10:05
ВЫРАЗИТЬ(ЕСТЬNULL(вт2.Поле, """") КАК СТРОКА)
5 andrewks
 
07.06.12
10:05
из-за вот этого:
ВЫРАЗИТЬ(ЕСТЬNULL(вт2.Поле, """") КАК СТРОКА)
6 Maxus43
 
07.06.12
10:05
бгг
7 EasyRider
 
07.06.12
10:06
такое условие соединения вообще можно не писать
8 Азазелло
 
07.06.12
10:08
Такое условие специально. И запрос, как понимаете, фейковый. Но он работает :)
9 Азазелло
 
07.06.12
10:08
(2), (3) а вот и нет!
10 kosts
 
07.06.12
10:08
"1" -?
11 Азазелло
 
07.06.12
10:09
(10) если бы... Тогда проблема преобразования ЧИСЛО к СТРОКА была бы наконец-то решена
12 Maxus43
 
07.06.12
10:09
Выразить(<Число> КАК СТРОКА) вернёт ошибку, не надо ляляля
13 EasyRider
 
07.06.12
10:10
(8)а что такого в этом условии?можно было так писать:

ИЗ
  вт КАК вт1,
  вт КАК вт2
14 Азазелло
 
07.06.12
10:10
(12) а теперь проверь ;)
15 Азазелло
 
07.06.12
10:10
(13) ЛЕВОЕ СОЕДИНЕНИЕ и конструкция ЕСТЬNULL
16 Sammo
 
07.06.12
10:11
Была помниться какая-то шняга, что выразить от числа не работало, а выразить от ЕстьNULL работало.
Но что возвращало - не помню.
17 Maxus43
 
07.06.12
10:12
в любом случае - конкатенацию не сделать, а для этого в основном и надо преобразовывать тип. Представление(1) тоже строку вернёт, но уже на клиенте
18 EasyRider
 
07.06.12
10:13
(15)
ИЗ
   вт КАК вт1
       ЛЕВОЕ СОЕДИНЕНИЕ вт КАК вт2
       ПО ИСТИНА

тоже самое что и

ИЗ
  вт КАК вт1,
  вт КАК вт2

не так?)
19 Sammo
 
07.06.12
10:13
А ты попробуй
ВЫРАЗИТЬ(ЕСТЬNULL(вт2.Поле, 0) КАК СТРОКА) КАК Поле3

Просто в результате 0 получается поле с составным типом, на один вид из которых можно применить Выразить как строка
20 Starhan
 
07.06.12
10:14
Можно просто написать
ВЫБРАТЬ
   ВЫРАЗИТЬ(ЕСТЬNULL(1, """") КАК СТРОКА) КАК Поле3
Вся фишка в этом
21 andrewks
 
07.06.12
10:15
никуя не понял. почему после естьнулл и выразить число в NULL переходит?
22 Азазелло
 
07.06.12
10:16
(18) нет, во втором случе - полное соединение
23 Starhan
 
07.06.12
10:16
Вся фишка в том что конструкция
ВЫРАЗИТЬ(ЕСТЬNULL(1, """") КАК СТРОКА)  вовзращает NULL
24 andrewks
 
07.06.12
10:17
(22) твои соединения тут вообще побоку, см. (20)
25 hhhh
 
07.06.12
10:17
(0) не работает. Выдает Поле3 = NULL. Что и следовало ожидать.
26 andrewks
 
07.06.12
10:17
(25) вопрос в том, почему ошибку не выдаёт
27 Азазелло
 
07.06.12
10:18
(21) вот и я сегодня с утра не понял, когда выгреб ошибку при попытке установить ТекстовоеСодержимое узла XML раныму NULLу.
(20) да, можно. Просто я специально привел ЛЕВОЕ СОЕДИНЕНИЕ, а условие ИСТИНА на самом деле может быть в реальной жизни и ЛОЖЬ.
Резюме, надо аккуратнее с такими конструкциями
28 Maxus43
 
07.06.12
10:19
баг видимо.
ТИПЗНАЧЕНИЯ(ПРЕДСТАВЛЕНИЕССЫЛКИ(Ссылка)) - валит платформу, а
ТИПЗНАЧЕНИЯ(ПРЕДСТАВЛЕНИЕ(Ссылка)) -нет
29 Sammo
 
07.06.12
10:20
(26) А нефиг писать запрос, результат которого колонки с составным типом
30 andrewks
 
07.06.12
10:20
тоже считаю, что баг
31 Maxus43
 
07.06.12
10:21
в профайлере кто-нить поглядите на запрос
32 EasyRider
 
07.06.12
10:21
(22)Левое соединение при условии Истина это тоже самое,что и полное соединение при условии Истина
33 Азазелло
 
07.06.12
10:22
(32) чой-то?
34 Азазелло
 
07.06.12
10:22
(33) ээээ... Да, я лошара :)
35 Maxus43
 
07.06.12
10:23
(33) в данном случае да, т.к. поля у таблиц 1 в 1
36 EasyRider
 
07.06.12
10:23
)
37 andrewks
 
07.06.12
10:23
+(32) и правое :)
38 Starhan
 
07.06.12
10:25
(29)То есть если я выберу запросом поле с составным типом строка b число. В котором значение число
И выражу его как строка результат будет NULL?
39 Starhan
 
07.06.12
10:26
строка и число*
40 hhhh
 
07.06.12
10:26
(26) видимо поэтому

Если <Выражение> содержит в составном типе требуемый <Тип значения>, то приведение типа считается осуществимым, и для каждого значения указанного типа результатом будет это самое значение. Для значений других типов результатом приведения типа будет значение NULL.

То есть выражения типа "ВЫБРАТЬ 1" содержит в себе все типы.
41 Maxus43
 
07.06.12
10:27
прикольно, короче видимо дошло до меня.
ЕСТЬNULL(1, """") - это уже определяет что тип у поля составной, строка-число.
Выразить - приводит к одному типу из составного, т.е. к строке.
т.к. строки там нет - вот и Нулл
42 Maxus43
 
07.06.12
10:27
Преобразование типов всё равно нереально в запросе
43 Starhan
 
07.06.12
10:27
(40) скорее выраженик ЕстьNULL(1,"""") делает поле с составным типом.
44 andrewks
 
07.06.12
10:28
(40) выбрать тут ни при чём. собака именно в естьнулл
45 hhhh
 
07.06.12
10:28
стоп, а что выдаст запрос?

ВЫБРАТЬ 1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ "1"
46 andrewks
 
07.06.12
10:29
(45) таблицу из двух строк
47 Maxus43
 
07.06.12
10:29
(45) тоже составной тип
48 andrewks
 
07.06.12
10:29
+(44) ибо
ВЫРАЗИТЬ(ЕСТЬNULL(1, """") КАК СТРОКА)
уже возвращает NULL
49 Starhan
 
07.06.12
10:31
(45)
ВЫБРАТЬ
   ВЫРАЗИТЬ(ЕСТЬNULL(ВложенныйЗапрос.Поле1, "") КАК СТРОКА) КАК Поле11
ИЗ
   (ВЫБРАТЬ
       1 КАК Поле1
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       "1") КАК ВложенныйЗапрос

да будет составной тип

1я строка NULL
вторая "1"
50 andrewks
 
07.06.12
10:32
составной тип тут при чём?
51 EasyRider
 
07.06.12
10:32
выбрать ВЫРАЗИТЬ(ЕСТЬNULL(1, "") КАК СТРОКА)

в профайлере кажет уже

SELECT CAST(NULL AS NVARCHAR)
52 Starhan
 
07.06.12
10:33
(50)а ну да :) ща переделаю
53 Starhan
 
07.06.12
10:34
+(52) вот тот же рузльтат.
ВЫБРАТЬ
   ВЫРАЗИТЬ(ВложенныйЗапрос.Поле1 КАК СТРОКА) КАК Поле11
ИЗ
   (ВЫБРАТЬ
       1 КАК Поле1
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       "1") КАК ВложенныйЗапрос
54 andrewks
 
07.06.12
10:34
(51)но приходит-то чистый NULL, не строка
55 EasyRider
 
07.06.12
10:35
(54)причем не через sp_executesql делается,а обычным запросом
56 andrewks
 
07.06.12
10:35
точнее, глюк в совместном использовании Выразить и ЕстьНулл
57 Starhan
 
07.06.12
10:36
Нет глюк именно в Выразить и составным полем (описано в (40))
А ЕстьNULL уже делает составное поле.

Точнее даже не глюк, а нормлаьная работа :)
58 andrewks
 
07.06.12
10:38
да, согласен.

Если <Выражение> содержит в составном типе требуемый <Тип значения>, то приведение типа считается осуществимым, и для каждого значения указанного типа результатом будет это самое значение. Для значений других типов результатом приведения типа будет значение NULL.
59 Sammo
 
07.06.12
10:39
Логика здесь следующая, имхо.
Есть таблица, в которой есть поле составного типа. Один из типов - строка
Значит можно применить Выразить как строка и по ошибке не выпадет
Но если попадется значение, которое нельзя приобразовать в строку, то результат будет Null
В "общем водка подорожает"
60 andrewks
 
07.06.12
10:40
именно так: естьнулл делает составной тип, а выразить возвращает нулл, ибо значения нужного типа не найдено
61 Maxus43
 
07.06.12
10:41
практической пользы нет один фиг. постулат о невозможности Преобразовании типа в запросе - остался, возможно только Приведение составных
62 andrewks
 
07.06.12
10:44
(59) "Но если попадется значение, которое нельзя приобразовать в строку, то результат будет Null "  

не совсем так. нулл возвращается потому, что в составном типе нет значения требуемого типа.

т.е., в принципе, преобразовать-то его можно (например, скуль умеет), но 1С заложило такой постулат, что нельзя
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.