![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
приведение типов в SQL
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 СУБД числа конкатенируют без проблем :)