Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.14;
Скачать: CL | DM;

Вниз

приведение типов в SQL   Найти похожие ветки 

 
3APA3A ©   (2004-02-11 11:38) [0]

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


 
DenK_vrtz ©   (2004-02-11 11:40) [1]

String concatenation - ||


 
Кщд   (2004-02-11 11:41) [2]

конкатенация - ||


 
Silver Alex ©   (2004-02-11 11:42) [3]

Calculeted Field или на OnGetText выводить чего надо


 
Academic ©   (2004-02-11 11:43) [4]


> 2)какое fieldname дать Columns"у в DBGrid"е чтобы он это
> отображал?

Ну можно что-нибудь наподобие
"Результат моих творческих изысканий на 11.02.04г."


 
Johnmen ©   (2004-02-11 11:44) [5]

select ...||...||... as fieldname from ...


 
3APA3A ©   (2004-02-11 11:48) [6]

to DenK_vrtz
то есть так
select a||"/"||b||"/"||c from...
я правильно понял?

to Academic
я спросил про DBGrid.Columns.FieldName а на DBGrid.Columns.Caption...Читайте внимательней...

to Silver Alex
а как через Calculated Fields?


 
3APA3A ©   (2004-02-11 11:49) [7]

to Johnmen
спасибо....все ясно...


 
Academic ©   (2004-02-11 11:51) [8]


> я спросил про DBGrid.Columns.FieldName а на DBGrid.Columns.Caption...Читайте
> внимательней...

Назвать выводимое поле можно как хочется даже в запросе.
как это делается

> Johnmen © (11.02.04 11:44)

И не стоит обвинять в невнимательности отвечающих. Нужно поискать в чем был невнимателен сам.


 
3APA3A ©   (2004-02-11 11:53) [9]

ну вот ты бы написал, как это делается, и претензий к тебе не было бы...


 
Sandman25 ©   (2004-02-11 11:56) [10]

[9] 3APA3A © (11.02.04 11:53)

Academic четко ответил на вопрос 2) из первого поста. Если не умеете задавать вопросы правильно, учитесь этому. И не нужно обижаться, если виноваты только сами.


 
3APA3A ©   (2004-02-11 12:04) [11]

никто и не обижается
но дело в другом
я пишу вот так select a||"/"||b||"/"||c as field1 from...
а BDE пишет "type mismatch in expression" Как правильно сформировать запрос?


 
Sandman25 ©   (2004-02-11 12:06) [12]

Кавычки должны быть одинарные.


 
3APA3A ©   (2004-02-11 12:10) [13]

ТАк и с одинарными тоже самое выдает
в Delphi пишу
select a||""/""||b||""/""||c as ....
тоже ругается...


 
Sandman25 ©   (2004-02-11 12:11) [14]

Вы сделали поля в дизайнере? Тогда сделайте данное поле заново (удалите, потом Add All Fields)


 
Sandman25 ©   (2004-02-11 12:13) [15]

Вы это поле указали как Date? Тогда нужно
cast ((a||"/"||b||"/"||c) as date) as fieldname
Причем, чтобы в BDE в качестве разделителя даты был настроен именно символ /


 
Alex_Bredin ©   (2004-02-11 12:18) [16]

ежу понятно, что числовые поля со строками не складывают


 
Alex_Bredin ©   (2004-02-11 12:19) [17]

и + от || ничем не отличен


 
Sandman25 ©   (2004-02-11 12:21) [18]

[16] Alex_Bredin © (11.02.04 12:18)

Точно.
cast(a as char(2)) и т.д.


 
Sandman25 ©   (2004-02-11 12:22) [19]

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


 
Alex_Bredin ©   (2004-02-11 12:26) [20]


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

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


 
Sandman25 ©   (2004-02-11 12:29) [21]

[20] Alex_Bredin © (11.02.04 12:26)

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

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


 
3APA3A ©   (2004-02-11 12:31) [22]

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


 
Alex_Bredin ©   (2004-02-11 12:32) [23]

2 Sandman25

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


 
Alex_Bredin ©   (2004-02-11 12:36) [24]

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:38) [25]

from не забудьте


 
3APA3A ©   (2004-02-11 12:43) [26]

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

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)
так? или можно как-нибудь поизящней?


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

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


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

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


 
Sandman25 ©   (2004-02-11 12:51) [29]

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


 
Alex_Bredin ©   (2004-02-11 12:57) [30]


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


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

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


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


 
3APA3A ©   (2004-02-11 12:57) [31]

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


 
3APA3A ©   (2004-02-11 12:59) [32]

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


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

[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.


 
Sandman25 ©   (2004-02-11 13:01) [34]

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

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


 
3APA3A ©   (2004-02-11 20:10) [35]

Еще одна проблема
есть, допустим в таблице такие записи
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
и все... то есть - дубл. записи он не выводит, а мне надо...
можно сделать, чтобы выводил все?


 
jack128 ©   (2004-02-11 21:48) [36]

union all


 
3APA3A ©   (2004-02-11 22:03) [37]

еще вопрос
почему вылезает ошибка 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;
Что неправильного?


 
ЮЮ ©   (2004-02-12 03:17) [38]

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.03.14;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.025 c
3-43356
Gerakl
2004-02-16 10:55
2004.03.14
ADO


3-43293
radix
2004-02-12 09:42
2004.03.14
Firebird тормозит на Win2003 ?


7-43926
KIE
2003-12-22 13:54
2004.03.14
Работа с модемом


1-43563
Maverick
2004-02-27 16:11
2004.03.14
FastReport


1-43630
Budy
2004-03-02 13:29
2004.03.14
Нажатие мышки вне формы