loading..
Русский    English
03:55
листать

Функция 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

На сайте имеются задачи, в которых требуется упорядочить (найти максимум и т. д.) в числовом порядке значения, представленные в текстовом формате. Например, номер места в самолете (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 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 NOT Больше тэгов
Учебник обновлялся
месяц назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100