loading..
Русский    English
21:53
листать

Функция LEN

Функция LEN(строковое выражение) возвращает число символов в строке, задаваемой строковым выражением. Ограничимся случаем, когда число символов больше единицы:

Консоль
Выполнить
  1. SELECT *
  2. FROM (SELECT class +' '+ name AS cn
  3. FROM Ships
  4. UNION ALL
  5. SELECT 'a' AS nc
  6. ) x
  7. WHERE LEFT(cn, 1) = RIGHT(cn, 1) AND
  8. LEN(cn) > 1;

Реализация функции LEN() в MS  Cистема управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft.SQL Server имеет одну особенность, а именно, она не учитывает концевые пробелы.

Давайте выполним следующий код:

  1. DECLARE @chr AS CHAR(12), @vchr AS VARCHAR(12);
  2. SELECT @chr = 'abcde' + REPLICATE(' ', 5), @vchr = 'abcde'+REPLICATE(' ', 5);
  3. SELECT LEN(@chr), LEN(@vchr);
  4. SELECT DATALENGTH(@chr), DATALENGTH(@vchr);

5 5
12 10

Фанкция REPLICATE добавляет справа к константе 'abcde' пять пробелов, которые не учитываются функцией LEN, - в обоих случаях мы получаем 5.

Функция DATALENGTH возвращает число байтов в строковом представлении и демонстрирует различие в типах данных CHAR и VARCHAR. DATALENGTH возвращает 12 для типа CHAR(12), and 10 - для VARCHAR(12).

Как и следовало ожидать, DATALENGTH для переменной типа VARCHAR вернуло фактическую длину строковой переменной. Но почему для переменной типа CHAR результат оказался равным 12? Дело в том, что CHAR является типом данных фиксированной длины. Если значение переменной меньше объявленной длины, а мы использовали CHAR(12), значение переменной будет дополнено концевыми пробелами, чтобы "выровнять" длину до 12 символов.

На сайте имеются задачи, в которых требуется упорядочить (найти максимум и т. д.) в числовом порядке значения, представленные в текстовом формате. Например, номер места в самолете (2d) или скорость привода CD-ROM (24x). Проблема заключается в том, что текст сортируется так (по возрастанию):

11a
1a
2a

Действительно,

Консоль
Выполнить
  1. SELECT '1a' AS place
  2. UNION ALL
  3. SELECT '2a'
  4. UNION ALL
  5. SELECT '11a'
  6. ORDER BY 1;

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

1a
2a
11a

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

  1. Извлечь число из строки.
  2. Привести его к числовому формату.
  3. Выполнить сортировку по приведенному значению.

Так как нам известно, что буква только одна, то для извлечения числа из строки можно воспользоваться следующей конструкцией, которая не зависит от числа цифр в номере места:

  1. LEFT(place, LEN(place) - 1)

Если только этим и ограничиться, то получим

place
1a
11a
2a

Приведение к числовому формату может быть следующим:

  1. CAST (LEFT(place, LEN(place) - 1) AS INT)

Осталось выполнить сортировку:

Консоль
Выполнить
  1. SELECT *
  2. FROM (SELECT '1a' AS place
  3. UNION ALL
  4. SELECT '2a'
  5. UNION ALL
  6. SELECT '11a'
  7. ) x
  8. ORDER BY CAST(LEFT(place, LEN(place) - 1) AS INT);

Что и требовалось доказать.

Ранее мы для извлечения числа из текстовой строки пользовались функцией LEFT, так как нам было известно априори, какое число символов нужно убрать справа (один). А если же нужно извлечь строку из подстроки не по известной позиции символа, а по самому символу? Например: извлечь все символы до первой буквы х (значение скорости привода CD-ROM).

В этом случае мы можем использовать также уже рассмотренную ранее функцию CHARINDEX, которая позволит определить неизвестную позицию символа:

Консоль
Выполнить
  1. SELECT model, LEFT(cd, CHARINDEX('x', cd) -1)
  2. FROM PC;


Bookmark and Share
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX MIN MONTH MySQL Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100