Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Какая функция в SQL конвертирует Null в ноль?


Автор: Неопытный 1.12.2006, 09:05
Какая функция в SQL конвертирует Null в ноль, В акцес функция Nz, В Delphi она не срабатывает

Автор: Akella 1.12.2006, 09:29
в каком именно SQL?

Добавлено @ 09:30 
можно так
Код

if f = null then f = 0

Автор: Неопытный 1.12.2006, 09:37
Использую Ado при подключении к Аксесу,
 В компоненте AdoQuery в Sql запрос типа 

'select ... nz(Table1.Pole1) as q ...' 
На nz - пишет неизвесная функция

Автор: PROeXT 1.12.2006, 10:33
Можно и средствами самой Delphi обойтись... Например, после открытия запроса:

Код

IF VarIsNull(ADOQuery.FieldByName('q').Value) Then
Begin
 //Получили в результате запроса NUll
End {IF}
Else
 Begin
  {А тут не Null}
 End; {Else}

Автор: ТоляМБА 1.12.2006, 10:54
Код

SELECT Table10.one, Table10.two
FROM Table10
where Table10.two is not null
union
select  Table10.one, 0
from table10
where Table10.two is null ;

Автор: Неопытный 1.12.2006, 11:28
Цитата(ТоляМБА @ 1.12.2006,  10:54)
Код

SELECT Table10.one, Table10.two
FROM Table10
where Table10.two is not null
union
select  Table10.one, 0
from table10
where Table10.two is null ;

У вас IsNull в условии where Table10.two is not null
Мне нужно порсто конвертировать Null В 0 в вычислимом поле

...A+Null as B... дает Null

Автор: Vas 1.12.2006, 11:49
Неопытный, скажи что за БД. В них разные функции в оракле например nvl(Field, 0) вместо 0 поставить можно любое число.

Цитата(Неопытный @  1.12.2006,  11:28 Найти цитируемый пост)
Мне нужно порсто конвертировать Null В 0 в вычислимом поле

Интересно, а может просто все числа которые участвуют в вычисляемом поле просто в запросе конвертировать в 0 и тады 0+0=0 будет в вычисляемом поле 0 или что ты там еще хочешь.

Автор: Неопытный 1.12.2006, 12:50
Я же говорю б.д. Access, nz - не работает

Добавлено @ 12:58 
Цитата

Интересно, а может просто все числа которые участвуют в вычисляемом поле просто в запросе конвертировать в 0 и тады 0+0=0 будет в вычисляемом поле 0 или что ты там еще хочешь.

Так их физически нет!
В запросе присутствует декартово произведение.
Связь A--->B
В результате нек информация берется из таблы A, а чиловая из таблы B,
Если то что есть в A тсутствует в B, в результирующем запросе ест-но вместо числа из B будет
Null. Так вот нужно просто это Null заменить на 0. Нужна функция. Nz - не работает.
Я знаю, что можно Where not is Null ... , но тогда запись не попадет в выборку, а запись все равно нужна. 

Автор: Vas 1.12.2006, 13:09
Используй IIF, вот пример, проверял в Ацессе 2003 работает.
Код

SELECT iif(IsNull([id]),0,[id]), name
FROM mytable;

Автор: Неопытный 1.12.2006, 13:12
Получилось вроде 
...+Iif(IsNull(x)=0,x,0) as w ...
До этого пробовал 
...+Iif(IsNull(x)=0;x;0) as w ...
Ругается на синтаксис хотя в Аксе 
...+Iif(IsNull(x)=0;x;0) as w ...
странно...

Добавлено @ 13:14 
Цитата(Vas @ 1.12.2006,  13:09)
Используй IIF, вот пример, проверял в Ацессе 2003 работает.
Код

SELECT iif(IsNull([id]),0,[id]), name
FROM mytable;

Блин столько времени потярял из-за ;
Сразу ведь так и делал, но ставил ,
И всетаки почему Nz не работает.

Автор: Vas 1.12.2006, 13:21
Цитата(Неопытный @  1.12.2006,  13:12 Найти цитируемый пост)
И всетаки почему Nz не работает.

У Билла Гейтса спроси  smile 

Автор: Неопытный 1.12.2006, 13:23
Цитата(Vas @ 1.12.2006,  13:21)
Цитата(Неопытный @  1.12.2006,  13:12 Найти цитируемый пост)
И всетаки почему Nz не работает.

У Билла Гейтса спроси  smile

А как с ним связаться, есть телефончик...

Автор: comtat 1.12.2006, 16:50
есть такая функция как isnull(Где определяем, на че меням)

Автор: sonyi 16.3.2009, 20:41
Но при использовании ISNull() выдает ошибку "Capability not supported". Как сделать, чтоб встроеные функции SQL работали в Query?

Автор: former 16.3.2009, 20:46
Цитата(sonyi @  16.3.2009,  20:41 Найти цитируемый пост)
ISNull() выдает ошибку "Capability not supported"

И не будет работать, поскольку эта функция возвращает наличие данных в поле.
Нужно:
Код

if ADOQuery1.FieldByName('abc').IsNull=true then


Добавлено @ 20:49
Цитата(sonyi @  16.3.2009,  20:41 Найти цитируемый пост)
Как сделать, чтоб встроеные функции SQL работали в Query?

Что ты хочешь получить в итоге?

Автор: sonyi 16.3.2009, 20:57
А как тогда быть если в селекте хочу просумировать суму нескольких полей < Sum(Sum(A1)+Sum(A2)+Sum(A3)) >, а одна из A=0 то результат тоже 0?

Автор: former 16.3.2009, 21:00
Цитата(sonyi @  16.3.2009,  20:57 Найти цитируемый пост)
А как тогда быть если в селекте хочу просумировать суму нескольких полей < Sum(Sum(A1)+Sum(A2)+Sum(A3)) >, а одна из A=0 то результат тоже 0? 

Почему ноль? Это же  сумма!  1+0=1 smile 

Автор: sonyi 16.3.2009, 21:04
Это правда. Но если при сумме поля А1 имеется хоть один ноль то вся сумма будет 0 (вроде)

Автор: former 16.3.2009, 21:05
sonyi, Null - это не ноль, а метка о том, что данные в ячейке отсутствуют. При суммировании они просто прибавляться не будут, т.е. фактически будут возвращать ноль (с точки зрения математики).

Добавлено через 2 минуты и 14 секунд
Цитата(sonyi @  16.3.2009,  20:57 Найти цитируемый пост)
Sum(Sum(A1)+Sum(A2)+Sum(A3)) >, а одна из A=0 то результат тоже 0? 

А - это что, поле?
Цитата(sonyi @  16.3.2009,  21:04 Найти цитируемый пост)
Но если при сумме поля А1 имеется хоть один ноль то вся сумма будет 0 (вроде) 

Это только в том случае, если все строки в А - Null или значения в них равны нулю

Автор: sonyi 16.3.2009, 21:20
select Data, A1+A2+A3+A4 as suma
from aa
where Data BETWEEN "01.02.2009" AND "28.02.2009"
//---------------------------

A1..A4 numeric
Если хоть один из А1..А4 пустой(Null) то поле suma пустая. Вот токое у меня

Добавлено @ 21:21
В SQL-ле работает функция ISNULL(A1,0) а в Делфи нет.

Автор: Kbl4AH 16.3.2009, 23:46
Цитата(sonyi @  16.3.2009,  21:20 Найти цитируемый пост)
В SQL-ле работает функция ISNULL(A1,0) а в Делфи нет.

сильно сказано! я бы сказал, что она работает в Transact-SQL...
Т.к., например, в PL/SQL другая функция - nvl(field, value)

Автор: sonyi 13.4.2009, 20:21
А какой язык SQL используется в TQuery подключенной к таблице Paradox? Потому что некоторые встроеные функции SQL не работают.

Автор: Akella 13.4.2009, 21:18
SQL92?

Добавлено через 1 минуту и 52 секунды
Только что заглянул в справку по BDE
Цитата

For more specific information about the BDE implementation of the SQL-92 specification


Добавлено через 2 минуты и 20 секунд
Цитата

What is local SQL?

Local SQL is the subset of the SQL-92 specification used to access dBASE, Paradox, and FoxPro tables. On receving local SQL statements from front-end applications, the Borland Database Engine (BDE) translates the statements into BDE API functions.

The local SQL language set

The SQL statements fall into two categories: Data Manipulation Language (DML) and Data Definition Language (DDL).

DML consists of SQL statements used for retrieving, inserting, updating, and deleting table data. SELECT is a DML statement.

DDL consists of SQL statements used for creating, altering, and deleting tables, and for creating and deleting indexes. CREATE TABLE and DROP INDEX are DDL statements.

For a complete introduction to ANSI-standard SQL, see one of the many available third-party books. 



Добавлено через 3 минуты и 13 секунд
Цитата(sonyi @  13.4.2009,  20:21 Найти цитируемый пост)
Потому что некоторые встроеные функции SQL не работают. 

Какие именно, религия не позволяет написать? Мало того, встроенные куда?

Автор: sonyi 13.4.2009, 21:48
Цитата(Akella @ 13.4.2009,  19:18)

Какие именно, религия не позволяет написать? Мало того, встроенные куда?

Ну например ISNULL().

Автор: Kbl4AH 13.4.2009, 22:33
Цитата(sonyi @  13.4.2009,  22:48 Найти цитируемый пост)
Ну например ISNULL().

Хм, интересный ты... А почему это в парадоксе должна работать функция из sql сервера (язык Transact-SQL, как я уже говорил выше)???

ЗЫ. Частенько для функций одного языка есть анлогичные функции для других языков...
Цитата

COALESCE (V1, V2) эквивалентно следующему: CASEWHENV1 ISNOTNULLTHENV1 ELSEV2 END. 
COALESCE (V1, V2, . . . ,n) для n >= 3 эквивалентно CASEWHENV1 ISNOTNULLTHENV1 ELSECOALESCE (V2, . . . ,n) END.
© Язык баз данных SQL/92

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)