Программирование >>  Руководство по sql 

1 ... 71 72 73 [ 74 ] 75 76 77 ... 105


Конечно, пит по-прежнему является символьным полем, поэтому вы не сможете выполнять с ним математические операции. Запрос, подобный приведенному ниже, возвращает ошибку (если, разумеется, ваша система не умеет находить среднеарифметическое символьных значений):

SQL:

select avg(num) from split

У вас есть возможность разрешить эту проблему, создав курсор, в котором пит будет интерпретироваться как целочисленный тип данных. Воспользуйтесь курсором split с одним важным дополнением - функцией CONVERT, которая преобразует один тип данных в другой. Синтаксис этой функции следующий:

CONVERT (тип данных [длина], выражение)

Чтобы применить эту функцию к столбцу пит, заменяя его тип данных на целочисленный (integer), нужно записать:

convert(int, num)

Но при этом надо помнить, что пит является, в сущности, подстрокой (SUBSTRING) поля titlejd. Чтобы завершить работу, подставьте в функции CONVERT вместо пит соответствующее выражение SUBSTRING.

convert(int, substring(title id, 3, 4))

Полностью запрос теперь примет следующий вид:

SQL:

select substring(title id, 1, 2) as alpha, convert (int, substring (titlejd, 3, 4)) as num from titles where price > $19.99

Если вы создадите другой курсор с помощью этого варианта запроса, то сможете воспользоваться для поля пит числовыми функциями, такими как AVG:

SQL:

select avg(num) from split2

Результат:

3628

В зависимости от того, как ваша система обрабатывает среднеарифметические и целочисленные значения, вы можете получить другой результат.

Выравнивание строки символов но правому краю

Теперь перейдем к более сложной задаче. Как выполняется выравнивание строк символов по правому краю? Простейший (и самый разумный) способ заключается в использовании профаммы генерации отчетов или какой-либо специальной программы отображения. Если ни того, ни другого у вас нет, или указанный способ не подходит вам по какой-то другой причине (например, вы хотите воспользоваться SQL из принципа ), попытайтесь воспользоваться следующим рецептом.

Ниже приведен пример отображения по умолчанию (с выравниванием по левому краю) имени и фамилии в таблице authors. Предложение WHERE офаничи-вает выдаваемые на печать результаты только теми авторами, первой буквой имени, которых является А.



SQL:

select au fname, au lname from authors

where au fname like A%

Результат: au fname

Abraham

Albert

Anne

Akiko

au Iname

Bennet Ringer Ringer Dull

Yokomoto

Чтобы выровнять эти данные по правому краю, вам придется выполнить следующую процедуру для каждого поля имени.

1. Найти определенный размер столбца (в операторе CREATE TABLE) и фактический размер данных, хранящихся в этом столбце.

2. Для каждого столбца вычислить разницу между определенным размером столбца и фактическим размером данных.

3. Поместить слева от каждого значения количество пробелов, которое соответствует вычисленной разнице.

4. Добавить данные справа от пробелов; сумма пробелов слева и фактические данные справа дадут в итоге определенный размер столбца.

Большинство разработчиков реализуют в своих системах тот или иной способ получения информации об определенной длине столбца и фактической длине данных. В Transact-SQL можно воспользоваться двумя системными функциями: COL LENGTH и DATALENGTH. Вот их синтаксис:

COL LENGTH(имя объекта, имя столбца)

DATALENGTH(выражение)

Подробнее об этих функциях вы можете узнать из справочного руководства по своей системе.

Ниже приведен пример использования этих функций:

SQL:

select au fname,

col length(authors, au fname) as col, datalength(au fname) as data, col length(authors, au fname)

datalength(au fname) as diff

from authors

where au fname like A%

Результат: au fname

Abraham

Albert

Anne

Akiko

~2Q~ 20 20 20 20

data

1 3 5 4 6

diff

1.3~ 17 15 16 14

Глава 11. Разрешение проблем

8 Поактическое оуковояство по SOf,



в таблице результатов представлены длина столбца, фактический размер данных и разница между длиной столбца и длиной данных. Первая функция возвращает размер столбца, тогда как вторая находит количество символов в каждом столбце. Разница между этими двумя числами равна количеству пробелов, которые следует поместить с левой стороны поля, чтобы протолкнуть имена в конец поля и выровнять их, таким образом, по правому краю.

Теперь, когда вам известен размер данных и разница между ним и размером столбца, следующим ващим щагом должно стать заполнение поля нужным числом ведущих пробелов. REPLICATE представляет собой функцию Transact-SQL, предназначенную для вставки повторяющихся символов. Вот ее синтаксис:

REPLICATE(char expr, integer expr)

В этом примере char expr соответствует пробелу ( ), а integerexpr представляет собой количество повторений charexpr. В качестве integerexpr следует использовать разницу между datalength и coljength. Вот как все это вместе взятое будет выглядеть на данный момент:

SQL:

select replicate( col length (authors, au fname)

- datalength(au fname)) as Personal name,

replicateC , col length(authors, au lname)

- datalength(au lname)) as Surname from authors

where au fname like Al

Результат: Personal name Surname

Такой запрос выполняется без проблем, но все, что вы получите, - это заголовки столбцов и... пустой экран! Все, что вы сделали, - это было лищь заполнение пробелами слева; чтобы увидеть на экране нужную информацию, надо просто добавить данные.

Присоедините их, воспользовавшись функцией конкатенации. В Transact-SQL для этого надо воспользоваться знаком плюс (+). Синтаксис чрезвычайно прост:

выражение + выражение

Теперь получается следующий код:

SQL:

select replicateC , col length(authors, au fname)

- datalength(au fname)) + au fname as Personal name, replicate ( ,

col length(authors, au lname)

- datalength(au lname)) + au lname as Surname from authors

where au fname like A%

Эта версия обеспечивает вам заголовки столбцов и данные, выровненные по правому краю. Однако эти поля слишком велики. Чтобы оставить лишь то, что действительно нужно, добавьте функцию CONVERT для управления размером отображения:

SQL:

select convert(varchar (20), replicate ( ,

col length(authors, au fname)



1 ... 71 72 73 [ 74 ] 75 76 77 ... 105

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика