[sql-server] Как выбрать нижнюю часть строк? Sql часть строки


Вырезаем числовую часть из начала строки в transact-sql – Korobchinskiy's blog

Ноябрь 20 2017

Имеем сроку, начинающуюся с целого числа, вида 112-ОМГ, желаем вырезать из нее числовую часть. На stackoverflow приводится следующий код

declare @str varchar(50) set @str = '112-ОМГ ' select left(@str, patindex('%[^0-9]%', @str + '.') - 1) select patindex('%[^0-9]%', @str) -- для иллюстрации работы patindex

Небольшое пояснение к механике его работы. Функция left вырезает левую часть строки с заданным количеством симоволов.

Функция pathindex находит начальную позицию для заданного шаблона, нумерация начинается с 1. Согласно описанию шаблонов в MS SQL шаблон вида %[^0-9]% описывает любую строку, не имеющую в своем составе символов 0-9 (дополнительно про символ ^ в шаблонах t-sql).

Для строки 112-ОМГ patindex вернет 4 и соответственно left вырежет не только числовую часть, но и первый символ нечисловой, значит это значение надо уменьшить на 1.

Зачем нужно прибавление точки к строке? В случае пустой строки patindex вернет 0, который является недопустимым значением для left, так что мы просто гарантируем минимальную длину строки в 1 символ

Если числовую часть надо отконвертировать в int можно использовать например такую функцию

create function dbo.int_from_str (@str varchar(500)) returns int as begin declare @int as int set @int = 0 set @str = ltrim(rtrim(@str)) set @str = left(@str, patindex('%[^0-9]%', @str + '.') - 1) if @str is not null and @str <> '' begin set @int = cast(@str as int) end return @int end view source print ? select dbo.IntFromStr ('0Ч/Д') select dbo.IntFromStr ('84 ') select dbo.IntFromStr ('4.') select dbo.IntFromStr ('') select dbo.IntFromStr (null) select dbo.IntFromStr ('ч/д') select dbo.IntFromStr (' 385-F')

Источник

Метки: left, patindex, sql, строка Copyright 2017. Все права защищены.

korobchinskiy.com

MYSQL выбирает часть строки и порядок этой части PHP Lang

Я бы предложил вам посмотреть на строковые функции MySQL и, более конкретно, на функцию SUBSTRING_INDEX . Причина, по которой я предлагаю этот SUBSTRING состоит в том, что число до или после косой черты может быть больше, чем одно число, которое SUBSTRING бы длину первой и / или второй частей.

Пример:

SELECT `info`, SUBSTRING_INDEX(`info`, '/', 1) AS `first_part`, SUBSTRING_INDEX(`info`, '/', -1) AS `second_part` FROM `table` ORDER BY `first_part` ASC, `second_part` ASC;

Результат:

Дополнительный пример

В этом примере я использую CAST для преобразования второй части в целое число без знака, если оно содержит дополнительные символы, такие как символы или буквы. Другими словами, вторая часть «web-4/15». будет «15», а вторая часть «web-4/15 ****» также будет «15».

SELECT `info`, SUBSTRING_INDEX(`info`, '/', 1) AS `first_part`, CAST(SUBSTRING_INDEX(`info`, '/', -1) AS UNSIGNED) `second_part` FROM `table` ORDER BY `first_part` ASC, `second_part` ASC;

Если строки всегда будут соответствовать шаблону, который вы описали, мы можем предположить, что первое значение, которое вы хотите отсортировать, – это позиция индекса 5 в строке (5 символов слева). Второй символ – индекс 7. С учетом этого вы можете сделать следующее, считая, что строка «web-2/1» находится в поле с именем field:

SELECT `field` FROM `table` ORDER BY substr(`field`, 5, 1) ASC, substr(`field`, 7, 1) ASC;

Функции substr () принимают это поле как первый параметр, упомянутый выше индекс и третий параметр параметра, который является количеством для количества символов, которое должно включать начало второго варианта.

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

ruphp.com

[string] Как извлечь часть строки в t-sql [tsql] [sql-server]

Я бы рекомендовал комбинацию PatIndex и Left. Тщательно сконструированный, вы можете написать запрос, который всегда работает, независимо от того, как выглядят ваши данные.

Пример:

Declare @Temp Table(Data VarChar(20)) Insert Into @Temp Values('BTA200') Insert Into @Temp Values('BTA50') Insert Into @Temp Values('BTA030') Insert Into @Temp Values('BTA') Insert Into @Temp Values('123') Insert Into @Temp Values('X999') Select Data, Left(Data, PatIndex('%[0-9]%', Data + '1') - 1) From @Temp

PatIndex будет искать первый символ, который попадает в диапазон 0-9, и возвращает его положение символа, которое вы можете использовать с помощью функции LEFT для извлечения правильных данных. Обратите внимание, что PatIndex фактически использует Data + '1'. Это защищает нас от данных, в которых нет найденных чисел. Если чисел нет, PatIndex вернет 0. В этом случае функция LEFT будет ошибкой, потому что мы используем Left (Data, PatIndex - 1). Когда PatIndex вернет 0, мы получим Left (Data, -1), который возвращает ошибку.

Есть еще способы, которые могут потерпеть неудачу. Для полного объяснения я рекомендую вам прочитать:

Извлечение чисел с помощью SQL Server

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

LEFT («BTA200», 3) будет работать на примерах, которые вы указали, например:

SELECT LEFT(MyField, 3) FROM MyTable

Чтобы извлечь цифровую часть, вы можете использовать этот код

SELECT RIGHT(MyField, LEN(MyField) - 3) FROM MyTable WHERE MyField LIKE 'BTA%' --Only have this test if your data does not always start with BTA.

code-examples.net

[sql-server] Как выбрать нижнюю часть строк?

Извините, но я не думаю, что, по-моему, я вижу правильные ответы.

Функция TOP x показывает записи в неопределенном порядке. Из этого определения следует, что функцию BOTTOM нельзя определить.

Независимо от любого индекса или порядка сортировки. Когда вы выполняете ORDER BY y DESC сначала вы получаете строки с наивысшим значением y. Если это автогенерированный идентификатор, он должен показывать записи, добавленные последним в таблицу, как это было предложено в других ответах. Однако:

  • Это работает только в том случае, если имеется столбец с автогенерированным идентификатором
  • Он имеет значительное влияние на производительность, если сравнить его с функцией TOP

Правильный ответ должен состоять в том, что нет и не может быть эквивалентом TOP для получения нижних строк.

Казалось бы, что любой из ответов, которые реализуют предложение ORDER BY в решении, пропускает точку или на самом деле не понимает, что TOP вернет вам.

TOP возвращает неупорядоченный набор результатов запроса, который ограничивает запись, установленную для первых N возвращенных записей. (С точки зрения Oracle, это похоже на добавление где ROWNUM <(N + 1).

Любое решение, которое использует порядок, может возвращать строки, которые также возвращаются предложением TOP (поскольку этот набор данных был неупорядочен в первую очередь), в зависимости от того, какие критерии были использованы в порядке

Полезность TOP заключается в том, что, как только набор данных достигнет определенного размера N, он перестает извлекать строки. Вы можете получить представление о том, как выглядят данные, не забирая их все.

Чтобы точно реализовать BOTTOM, ему нужно было бы удалить весь набор данных неупорядоченным, а затем ограничить набор данных конечными N записями. Это не будет особенно эффективно, если вы имеете дело с огромными таблицами. И он не обязательно даст вам то, о чем вы думаете, о чем вы просите. Конец набора данных может не обязательно быть «последними вставленными строками» (и, вероятно, не будет для большинства приложений с поддержкой DML).

Аналогичным образом, решения, реализующие ORDER BY, к сожалению, потенциально катастрофичны при работе с большими наборами данных. Если у меня есть, скажем, 10 миллиардов записей и вы хотите последних 10, то достаточно глупо заказать 10 миллиардов записей и выбрать последние 10.

Проблема здесь в том, что BOTTOM не имеет значения, о котором мы думаем, сравнивая его с TOP.

Когда записи вставляются, удаляются, вставляются, удаляются снова и снова, некоторые пробелы появляются в хранилище, а затем, если возможно, будут вставлены строки. Но то, что мы часто видим, когда мы выбираем TOP, представляется отсортированными данными, потому что оно, возможно, было вставлено на раннем этапе в существование таблицы. Если таблица не содержит много исключений, она может быть упорядочена. (например, даты создания могут быть такими же, как и создание таблицы). Но реальность такова, что если это таблица с избыточным весом, строки TOP N могут вообще не выглядеть.

Итак - нижняя строка здесь (каламбур) заключается в том, что кто-то, кто просит записи BOTTOM N, фактически не знает, чего они просят. Или, по крайней мере, то, о чем они просят, и что на самом деле означает BOTTOM, - это не одно и то же.

Таким образом - решение может удовлетворить реальную деловую потребность запрашивающего ... но не соответствует критериям для BOTTOM.

code-examples.net

Cybern.ru » SQL Урок 11. Работа со строками

В рамках данной статьи мы рассмотрим функции для работы со строками:ASCII — возвращает ASCII код левой буквы. Ее можно использовать для того, чтобы вывести количество различных символов с которых начинаются имена студентов. SELECT COUNT(DISTINCT ASCII(Name)) FROM StudentCHAR — обратная к ASCII функция, возвращает символ по его номеру. Поэтому с помощью нее можно вывести эти различные буквы: SELECT DISTINCT CHAR(ASCII(Name)) FROM StudentLEFT — позволяет вернуть n первых символов. Так что приведенную ниже задачу можно было решить так: SELECT LEFT(Name, 1) FROM StudentRIGHT — позволяет вернуть n последних символов. Является парной к LEFT. RIGHT( строка, n)CHARINDEX — позволяет выполнить поиск подстроки в строке. Возвращает позицию первого вхождения. CHARINDEX( подстрока, строка, [индекс]) Необязательный параметр индекс обозначает с какой позиции необходимо вести поиск подстроки.PAINTINDEX — возвращает тоже, что и CHARINDEX, но позволяет использовать в качестве подстроки шаблон. PAINTINDEX( шаблон , строка) Выведем всех студентов, имя у которых начинается на ‘A’. Напомним что в шаблоне разрешается использование специальных символов ‘_'(любой символ), ‘%’ (последовательность символов). Шаблон должен быть обернут %. SELECT * FROM Student WHERE PAINTINDEX( '%A%%' , Name) > 0LEN — возвращает число символов в строке. LEN(строка)SUBSTRING — возвращает подстроку, которая начинается с начальной_позиции. SUBSTRING(строка, начальная_позиция, длина_подстроки)REVERSE — переворачивает строку. REVERSE(строка)REPLACE — заменяет все вхождения подстроки_1 в строке на подстроку_2. REPLACE(строка, подстрока_1, подстрока_2)STUFF — заменяет n символов в строке на подстроку начиная с начальной_позиции. STUFF(строка, начальная_позиция, n, подстрока)LTRIM — возвращает строку без лидирующих пробелов.RTRIM — возвращает строку без конечных пробелов. LTRIM(строка) RTRIM(строка)LOWER — опускает все символы строки в нижний регистр.UPPER — опускает все символы строки в нижний регистр. LOWER(строка) UPPER(строка)UNICODE — возвращает код первого символа в строке.NCHAR — возвращает символ по коду. UNICODE(строка) NCHAR(код)

cybern.ru

Как извлечь часть строки в t-sql MS SQL Server

Я бы рекомендовал комбинацию PatIndex и Left. Тщательно сконструированный, вы можете написать запрос, который всегда работает, независимо от того, как выглядят ваши данные.

Пример:

Declare @Temp Table(Data VarChar(20)) Insert Into @Temp Values('BTA200') Insert Into @Temp Values('BTA50') Insert Into @Temp Values('BTA030') Insert Into @Temp Values('BTA') Insert Into @Temp Values('123') Insert Into @Temp Values('X999') Select Data, Left(Data, PatIndex('%[0-9]%', Data + '1') - 1) From @Temp

PatIndex будет искать первый символ, который попадает в диапазон 0-9, и возвращает его положение символа, которое вы можете использовать с помощью функции LEFT для извлечения правильных данных. Обратите внимание, что PatIndex фактически использует Data + '1'. Это защищает нас от данных, в которых нет найденных чисел. Если чисел нет, PatIndex вернет 0. В этом случае функция LEFT будет ошибкой, потому что мы используем Left (Data, PatIndex – 1). Когда PatIndex вернет 0, мы получим Left (Data, -1), который возвращает ошибку.

Есть еще способы, которые могут потерпеть неудачу. Для полного объяснения я рекомендую вам прочитать:

Извлечение чисел с помощью SQL Server

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

подстрока (поле, 1,3) будет работать на ваших примерах.

select substring(field, 1,3) from table

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

select substring(field, 1, PATINDEX('%[1234567890]%', field) -1) from table where PATINDEX('%[1234567890]%', field) > 0

LEFT («BTA200», 3) будет работать на примерах, которые вы указали, например:

SELECT LEFT(MyField, 3) FROM MyTable

Чтобы извлечь цифровую часть, вы можете использовать этот код

SELECT RIGHT(MyField, LEN(MyField) - 3) FROM MyTable WHERE MyField LIKE 'BTA%' --Only have this test if your data does not always start with BTA. declare @data as varchar(50) set @data='ciao335' --get text Select Left(@Data, PatIndex('%[0-9]%', @Data + '1') - 1) ---->>ciao --get numeric Select right(@Data, len(@data) - (PatIndex('%[0-9]%', @Data )-1) ) ---->>335

sqlserver.bilee.com