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

1 ... 74 75 76 [ 77 ] 78 79 80 ... 105


Этот запрос предназначен для поиска записей, датированных 21-м октября 1985 г. (время 12:00). Чтобы получить все записи за это число с любым временем, надо внести дополнительный код. Для проверки этих решений изменим сначала одну из дат:

SQL:

update titles

set pubdate = Oct 21 1985 2:30PM

where pubdate = Oct 21 1985 and price = $20.95

update titles

Теперь запрос возвращает только одну строку:

SQL:

select price, pubdate from titles

where pubdate = Oct 21 1985 Результат:

price pubdate

ir.l 9 Oct~2~ri98 5~ Г2~:~ 00AM

Довольно простой метод поиска всех строк, введенных в один день, заключается в предоставлении исчерпывающего описания: вы указываете минимальное и максимальное значения времени для интересующего вас дня и используете ключевое слово BETWEEN для поиска всех записей, удовлетворяющих этим критериям:

SQL:

select price, pubdate from titles where pubdate

between Oct 21 1985 00:00

and Oct 21 1985 23:59

Результат:

price pubdate

21.59 Oct 21 1985 12:00AM

20.95 Oct 21 1985 2:30PM

Другая идея состоит в использовании ключевого слова LIKE для поиска всего, что совпадает с известной частью даты. В данном случае шаблон знак процента (%) обозначает все, что следует за той частью даты, которая соответствует месяцу, дню и году:

SQL:

select price, pubdate from titles

where pubdate like Oct 21 1985%

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

SQL:

select price, pubdate from titles

where convert(char (11), pubdate) = Oct 21 1985



Другой подход связан с использованием функций даты. Выясните, имеются ли подобные функции в вашей системе. В приведенном ниже примере используется функция DATEPART, которая сравнивает каждую известную часть (месяц, день и год) полного значения даты с ее численным представлением (октябрь соответствует 10). Вре-менноя часть даты значения уже не имеет. Синтаксис функции DATEPART:

DATEPART (часть даты, дата)

Вот как выглядит такой запрос:

SQL:

select price, pubdate from titles

where datepart(mm, pubdate) = 10 and datepart(dd, pubdate) =21 and datepart(yy, pubdate) =1985

DATEADD - еще одна функция подобного типа. Используйте ее, чтобы добавить один день к известной дате. Затем вы можете отыскать все данные, удовлетворяющие заданным параметрам, не заботясь о времени, как показано в следующем примере.

SQL:

select price, pubdate from titles

where pubdate between Oct 21 1985 and

dateadd(day, 1, Oct 21 1985)

Этот запрос позволяет найти все записи, помеченные датами от 10/21/85 и до 10/22/85 (т.е. на один день позже).

Замена пробелов на нули

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

В более длительной перспективе имеет смысл продумать способ введения определенных жестких правил работы. Это может означать использование специальных правил, триггеров или предварительных анализаторов, которые предотвращали бы появление пробелов там, где необходимы нули. Если же говорить о ближа(5ших задачах, то вам надо каким-то образом избавиться от пробелов.

Например, кто-то добавил двух новых авторов в таблицу authors. Их имена и идентификационные номера введены правильно, но информация о телефонах и адресах неполна - это просто строки пробелов. (Все адресные поля - city, state, zip и phone - допускают нулевые значения.)

Если вы не имеете ничего против примера с известной вам базой данных, вставьте следующие две строки в таблицу authors:

SQL:

insert authors

values (123-45-6789, Wu, Amelia, , III )

insert authors

values (123-54-6789, Khandasamy, J., , III I



Если выполнить оператор SELECT по отношению к полям имени, телефонного номера и адреса (укороченным с помошью функции SUBSTRING для удобочитаемости), то будут получены следующие результаты:

Результат:

au fname phone address city state zip

Amelia

Как сделать, чтобы эти строки были совместимы с остальной частью таблицы и отобразить NULL там, где нужная информация пропущена или неизвестна? Функция RTRIM в Sybase Transact-SQL удаляет хвостовые пробелы (те, которые находятся с правой стороны). Когда в поле нет ничего, кроме пробелов, и в этом поле допускается значение NULL, функция RTRIM удаляет пробелы, а система (которая явно испытывает отвращение к вакууму) вставляет NULL. Синтаксис функции RTRIM следующий:

RTRIM(символьное выражение)

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

Вот как выглядит оператор UPDATE с (таким вариантом) функции RTRIM:

SQL:

update authors

set phone = rtrim(phone),

address = rtrim(address) city = rtrim(city), state = rtrim(state), zip = rtrim(zip) where au id like 123%

Этот запрос позволяет получить следующие результаты:

SQL:

select au fname, phone, address, city, state, zip

from authors

where au id like 123%

Результат:

au fname phone address city state zip

Amelia NULL NULL NULL NULL NULL

J. NULL NULL NULL NULL NULL

Если же поля, которые вы подстригаете подобным образом, не допускают значений NULL, система не будет вставлять NULL и выдаст сообщение об ошибке - но это уже совсем другая проблема. В нашем примере мы предполагаем, что со значением NULL у вас не возникнет проблем.

Чтобы привести в порядок все свои данные в процессе преобразования пустых полей, воспользуйтесь функцией LTRIM для удаления ведущих (левосторонних) пробелов. (Напоминаем, что функция RTRIM удаляет хвостовые пробелы.) Синтаксис функции LTRIM аналогичен синтаксису RTRIM. Например, имя г-на Khandasamy ( J. ) было вставлено в таблицу с двумя ведущими пробелами. Их можно удалить, добавив следующие строки кода:

SQL:

update authors

set au fname = ltrim(au fname)



1 ... 74 75 76 [ 77 ] 78 79 80 ... 105

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