|
Поведение ЕСТЬNULL() | ☑ | ||
---|---|---|---|---|
0
luter-89
01.12.16
✎
16:14
|
Сегодня обратил внимание на странное поведение оператора ЕСТЬNULL().
Пример: Длина кода справочника - 9 символов. Естьnull(Сотрудники.Код,"9999999999999999999999999999") вернет - "999999999" Получается Естьnull еще и длину строки устанавливает. Пришлось обходить через ВЫБОР КОГДА. Кто-нибудь сталкивался с таким поведением, странно, что раньше не замечал |
|||
1
DrShad
01.12.16
✎
16:18
|
сталкивались конечно
НайтиПоНаименованию(NULL) вернет первую попавшуюся ссылку |
|||
2
RomanYS
01.12.16
✎
16:18
|
Естьnull не приводит типы, где-то в коде это сделал.
|
|||
3
RomanYS
01.12.16
✎
16:21
|
(1) в чем вопрос? ты неявно привел null к пустой строке и по ней ищешь - получишь первую попавшуюся. Укажи второй параметр (ТочноеСовпадение = Истина) и не получишь ничего
|
|||
4
Fragster
гуру
01.12.16
✎
16:23
|
https://msdn.microsoft.com/ru-ru/library/ms184325.aspx
Возвращает тот же тип, что и аргумент check_expression. Если литерал NULL указывается в качестве check_expression, возвращает тип данных значения replacement_value. Если литерал NULL указывается в качестве check_expression и не указано никакого значения replacement_value, возвращает int. |
|||
5
Fragster
гуру
01.12.16
✎
16:24
|
Заметки
Значение аргумента check_expression возвращается в случае, если оно не равно NULL. В противном случае возвращается значение аргумента replacement_value, после того как это значение будет неявно преобразовано к типу значения аргумента check_expression, если типы различаются. replacement_value может быть усечено, если длина replacement_value превышает check_expression. |
|||
6
Fragster
гуру
01.12.16
✎
16:25
|
короче, это фича
|
|||
7
NafNaf2000
01.12.16
✎
16:27
|
ВЫБРАТЬ
ВложенныйЗапрос.Ф, ЕСТЬNULL(Валюты.Код,"99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999") ИЗ (ВЫБРАТЬ 1 КАК Ф) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Валюты КАК Валюты ПО ВложенныйЗапрос.Ф ЕСТЬ NULL выдает: Ф Поле 1 1 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 |
|||
8
RomanYS
01.12.16
✎
16:29
|
||||
9
Fragster
гуру
01.12.16
✎
16:39
|
(7)(8) так то на файловой
|
|||
10
Fragster
гуру
01.12.16
✎
16:39
|
можете, кстати, багу открыть на v8, чтобы 1с это поправило
|
|||
11
Cool_Profi
01.12.16
✎
16:40
|
(9) На серверной 8.2.19 ничего не обрезается
|
|||
12
Fragster
гуру
01.12.16
✎
16:40
|
(11) с мсскуль?
|
|||
13
Cool_Profi
01.12.16
✎
16:40
|
(12) да
|
|||
14
RomanYS
01.12.16
✎
16:43
|
(9) в (8) тоже MSSQL
|
|||
15
RomanYS
01.12.16
✎
16:47
|
(5) в 1С похоже своя реализация ЕстьNULL. Иногда использую такие конструкции ЕстьNULL(Остатки.Количество, "нет остатка") и никогда не сталкивался здесь с приведением типов.
|
|||
16
DrShad
01.12.16
✎
16:49
|
так тут типы различаются
|
|||
17
mehfk
01.12.16
✎
16:51
|
(7) Преобразуется в
exec sp_executesql N'SELECT T1.Q_001_F_000_, ISNULL(CAST(T2._Code AS NVARCHAR(95)),@P1) FROM (SELECTн. 1.0 AS Q_001_F_000_) T1 LEFT OUTER JOIN dbo._Reference7 T2 WITH(NOLOCK) ON T1.Q_001_F_000_ IS NULL', N'@P1 nvarchar(4000)', N'99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999' результат очевиде |
|||
18
luter-89
01.12.16
✎
16:53
|
Платформа 8.3.9.1850
|
|||
19
mehfk
01.12.16
✎
16:54
|
(17)+ Платформа 8.3.6.2449
|
|||
20
mehfk
01.12.16
✎
17:00
|
А на 8.3.8.2088
SELECT T1.Q_001_F_000_, ISNULL(T2._Code,@P1) FROM (SELECT 1.0 AS Q_001_F_000_) T1 LEFT OUTER JOIN dbo._Reference70 T2 WITH(NOLOCK) ON T1.Q_001_F_000_ IS NULL',N'@P1 nvarchar(4000)',N'99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999' И там и там режим совместимости 8.2.16 |
|||
21
Fragster
гуру
01.12.16
✎
17:02
|
(20) а если разные типы (например число и строку) в естьнулл запихнуть? или, там, ссылку?
|
|||
22
mehfk
01.12.16
✎
17:05
|
(21) Если "99999..." заменить на число - то генерится CASE WHEN на 8.3.6
|
|||
23
mehfk
01.12.16
✎
17:08
|
на 8.3.8 то же самое.
exec sp_executesql N'SELECT T1.Q_001_F_000_, CASE WHEN T2._Code IS NULL THEN 0x03 ELSE CASE WHEN T2._Code IS NOT NULL THEN 0x05 END END, CASE WHEN T2._Code IS NULL THEN 100500.0 ELSE CASE WHEN T2._Code IS NOT NULL THEN 0.0 END END, CASE WHEN T2._Code IS NULL THEN P1 ELSE T2._Code END FROM (SELECT 1.0 AS Q_001_F_000_) T1 LEFT OUTER JOIN dbo._Reference70 T2 WITH(NOLOCK) ON T1.Q_001_F_000_ IS NULL',N'P1 nvarchar(4000)',N'' Вообще интересная фишка,результат запроса еще дополнительно обрабатывается. |
|||
24
HEKPOH
01.12.16
✎
17:15
|
(2) "Естьnull не приводит типы"
приводит |
|||
25
HEKPOH
01.12.16
✎
17:16
|
(0)
Функция ЕСТЬNULL() хоть и является аналогом операции ВЫБРАТЬ с проверкой значения на NULL, тем не менее, имеет отличие. Отличие заключается в том, что в случае, если выражение функции имеет строковой или числовой тип, то выражение замены будет преобразовано к типу проверяемого выражения. http://its.1c.ru/db/metod8dev#content:2653:hdoc |
|||
26
NafNaf2000
01.12.16
✎
17:18
|
(9) MSSQL
|
|||
27
RomanYS
01.12.16
✎
17:22
|
(25) да, написано одно, а работает по другому. Попробовал в (8) явно задать тип ЕСТЬNULL(Выразить(Сотрудники.Код как Строка(10)), "9999999999999999999999999999"), результат тот же - не обрезает
|
|||
28
HEKPOH
01.12.16
✎
17:40
|
(27) в моей практике такого не было, т.е. всегда обрезала
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |