loading..
Русский    English
05:23
листать

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


  • Имплантация
    Ортопедия, отбеливание, ортодонтия, имплантология. Лечение кариеса и др.
    22clinic.ru
Тэги:
ALL AVG battles CASE CAST CHAR CHARINDEX classes COALESCE Convert COUNT CTE DATEDIFF DATEPART DATETIME DELETE DISTINCT EXCEPT EXISTS EXTRACT FROM FULL JOIN GROUP BY Guadalcanal HAVING IN INNER JOIN insert INTERSECT ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX MIN MySQL NOT IN NULL ORDER BY Outcome outcomes OVER PARTITION BY pc PIVOT PostgreSQL printer product Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100