Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

приведение типов в SQL


Страницы:   1 2

3APA3A ©   (2004-02-11 11:38:00) 

Суть: есть Paradox"овская таблица типа (d int,m int,y int). Доступ через BDE. Надо с DBGrid вывести все эти числа в один столбец по такому принципу a+"/"+b+"/"+c (наподобие даты). BDE ругается когда я пишу "select a+"/"+b+"/"+c from ...", говорит типы несовместимы. Оно то понятно, но
1)как выбрать
2)какое fieldname дать Columns"у в DBGrid"е чтобы он это отображал?


ЮЮ   (2004-02-12 03:17:00) [1]

>3APA3A © (11.02.04 22:03) [37]
>Что неправильного?

В первом запросе первое поле Char(3), во втором - Char(7), а в третьем - Char(4), а типы полей при UNIOM, как известно, должны совпадать


3APA3A   (2004-02-11 22:03:00) [2]

еще вопрос
почему вылезает ошибка type mismatch in expression (я просто пишу это в DataBase Desktop, типа тестирую..)

select "<10" from "cl" where a<10 union select "10<<100" from "cl" where a between 10 and 100 union select ">100" from "cl" where a>=100;
Что неправильного?


jack128   (2004-02-11 21:48:00) [3]

union all


3APA3A   (2004-02-11 20:10:00) [4]

Еще одна проблема
есть, допустим в таблице такие записи
insert into ... (a) values(1);
insert into ... (a) values(1);
insert into ... (a) values(15);
insert into ... (a) values(15);
и если я пишу
select "0"+cast(a as char(1)) from ... where a<10 union
select cast(a char(2)) from ... where a>=10;
то result set будет такой
01
15
и все... то есть - дубл. записи он не выводит, а мне надо...
можно сделать, чтобы выводил все?


Sandman25   (2004-02-11 13:01:00) [5]

[32] 3APA3A © (11.02.04 12:59)

Ну так и засовывайте.
Делаете поле CHAR(10) и вперед :)


Sandman25   (2004-02-11 13:00:00) [6]

[30] Alex_Bredin © (11.02.04 12:57)

Знаю :)

Я и сам долго ругался, когда понял, что мне кроме даты придется записывать в таблицу еще и год, и месяц...
Дело в специфике LocalSQL.
Если нужны отчеты по годам, месяцам, то придется их хранить в БД.
select extract(month from mydate) mon, ...
from ..
group by extract(month from mydate)
(или group by 1, или group by mon)
не проходит, если используется BDE.


3APA3A   (2004-02-11 12:59:00) [7]

нет... речь идет не о датах...просто такой же набор чисел
два двузначных и одно четырехзначное.... а хочется их в одно поле засунуть, отсюда и извращения такие....


Alex_Bredin   (2004-02-11 12:57:00) [8]


> 3APA3A © (11.02.04 12:43) [26]


когда возникает необходимость написания таких конструкций, имеет смысл задуматься над структурой БД, например,

> Sandman25 © (11.02.04 12:50) [28]


а скорее всего(если речь идет о датах), то изначально неправильный подход


3APA3A   (2004-02-11 12:57:00) [9]

ладно... будем разбираться... всем спасибо... =)


Sandman25   (2004-02-11 12:51:00) [10]

LEN не поддерживается.


Sandman25   (2004-02-11 12:50:00) [11]

Поизящней делается добавлением в таблицу поля типа Date, дублирующей значения a/b/c.
Тем более, что она используется в фильтрации по дате. Скажут Вам отображать данные за 10 последних дней и что Вы будете делать?


Johnmen   (2004-02-11 12:49:00) [12]

Если поддерживается функция SUBSTRING и LEN, то можно проще.


3APA3A   (2004-02-11 12:43:00) [13]

А...принцип ясен... А если мне надо, допустим, два поля так сделать, то придется писать что-то типа

select "0"+cast(a as char(1)),"0"+cast(b as char(1))
where (a<10) and (b<10)
union
select cast(a as char(2)),"0"+cast(b as char(1))
where (a>=10)and(b<10)
union
select "0"+cast(a as char(1)),cast(b as char(2))
where (a<10)and(b>=10)
union
select cast(a as char(2)),cast(b as char(2))
where (a>=10)and(b>=10)
так? или можно как-нибудь поизящней?


Alex_Bredin   (2004-02-11 12:38:00) [14]

from не забудьте


Alex_Bredin   (2004-02-11 12:36:00) [15]

select "0"+cast(a as char(1))
where a<10
union
select cast(a as char(2))
where a>=10


Alex_Bredin   (2004-02-11 12:32:00) [16]

2 Sandman25

спасибо за полезную информацию :)


3APA3A   (2004-02-11 12:31:00) [17]

Все.... разобрался...Все работает....
Тольуо еще вопрос возник один - можно или нет сделать так, что бы если поле (a int) состоит из 1 цифры - к нему прибавлялся 0 слева, а если из 2-х - то ничего не делалось... Все это должно быть в запросе разумеется...


Sandman25   (2004-02-11 12:29:00) [18]

[20] Alex_Bredin © (11.02.04 12:26)

Ага. В Informix точно работает. Я поэтому и забыл по привычке :)

ЗЫ. Работает даже select dec(13,3)||int||date||(datetime year to minute)


Alex_Bredin   (2004-02-11 12:26:00) [19]


> В SQL СУБД числа конкатенируют без проблем :)

интересно...
я в этом не силен.,но Вы хотите сказать что явное приведение типов не требуется - автоматом в строку?


Sandman25   (2004-02-11 12:22:00) [20]

Но это нужно только в LocalSQL. В SQL СУБД числа конкатенируют без проблем :)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо