Sql количество символов: Функция LENGTH — подсчет количества символов

]Используется для указания списка nonmatching, где вы пытаетесь соответствовать любому символу, за исключением тех кто в списке.( )Используется для групповых выражений в качестве подвыражений.{m}Соответствует m раз.{m,}Соответствие как минимум m раз.{m,n}Соответствие как минимум m раз, но не более n раз.\nn представляет собой число от 1 до 9. Соответствует n-му подвыражению находящемуся в ( ) перед \n.[..]Соответствует одному сопоставлению элемента, который может быть более одного символа.[::]Соответствует классу символов.[==]Соответствует классу эквивалентности\dСоответствует цифровому символу.\DСоответствует не цифровому символу.\wСоответствует текстовому символу.\WСоответствует не текстовому символу.\sСоответствует символу пробел.\SСоответствует не символу пробел.\AСоответствует началу строки или соответствует концу строки перед символом новой строки.\ZСоответствует концу строки.*?Соответствует предыдущему шаблону ноль или более вхождений.+?Соответствует предыдущему шаблону один или более вхождений.??Соответствует предыдущему шаблону ноль или одному вхождению.{n}?Соответствует предыдущему шаблону n раз.{n,}?Соответствует предыдущему шаблону, по меньшей мере n раз.{n,m}?Соответствует предыдущему шаблону, по меньшей мере n раз, но не более m раз.

start_position
Необязательный. Это позиция в строке, откуда начнется поиск. это начало строки, а $ это конец строки, независимо от позиции этих символов в выражении. По умолчанию предполагается, что выражение в одной строке.‘x’Игнорируются символы пробелов. По умолчанию, символы пробелов совпадают, как и любой другой символ.

Функция REGEXP_COUNT возвращает числовое значение.

Примечание

  • Если для параметра match_parameter имеются конфликтующие значения, функция REGEXP_COUNT будет использовать последнее значение.
  • Если функция REGEXP_COUNT не обнаруживает какого-либо вхождение шаблона, она вернет 0.

Применение

Функцию REGEXP_COUNT можно использовать в следующих версиях Oracle / PLSQL:

  • Oracle 12c, Oracle 11g

Пример совпадения единичного символа

Рассмотрим простейший пример. Давайте посчитаем, сколько раз символ ‘a’ появляется в строке.
Например:

Oracle PL/SQL

SELECT REGEXP_COUNT (‘Aller Anfang ist schwer’, ‘a’)
FROM dual;

—Результат: 1



SELECT REGEXP_COUNT (‘Aller Anfang ist schwer’, ‘a’)

FROM dual;

 

—Результат: 1

Этот пример вернет 1, потому что он подсчитывает количество вхождений ‘a’ в строке. Так как мы не указали значение match_parameter, то функция REGEXP_COUNT выполнит поиск с учетом регистра, что означает, что символ ‘A’ не будет включен в счет.

Если бы мы хотели включить в наш результат как ‘a’, так и ‘A’, и выполнить поиск без учета регистра, то изменим наш запрос следующим образом:

Oracle PL/SQL

SELECT REGEXP_COUNT (‘Aller Anfang ist schwer’, ‘a’, 1, ‘i’)
FROM dual;

—Результат: 3



SELECT REGEXP_COUNT (‘Aller Anfang ist schwer’, ‘a’, 1, ‘i’)

FROM dual;

 

—Результат: 3

Теперь, поскольку мы предоставили start_position = 1 и match_parameter = ‘i’, то запрос в качестве результата вернет 3. На этот раз значения ‘a’ и ‘A’ будут включены в счет.

Если бы мы хотели подсчитать количество ‘a’ в столбце, мы могли бы попробовать что-то вроде этого:

Oracle PL/SQL

SELECT REGEXP_COUNT (last_name, ‘a’, 1, ‘i’) AS total
FROM contacts;



SELECT REGEXP_COUNT (last_name, ‘a’, 1, ‘i’) AS total

FROM contacts;

Этот запрос будет подсчитывать количество значений ‘a’ или ‘A’ в поле last_name из таблицы contacts.

Пример совпадения нескольких символов

Рассмотрим, как мы будем использовать функцию REGEXP_COUNT для соответствия многосимвольному шаблону.
Например:

Oracle PL/SQL

SELECT REGEXP_COUNT (‘Gute Saat, gute Ernte’, ‘gute’, 1, ‘i’)
FROM dual;

—Результат: 2



SELECT REGEXP_COUNT (‘Gute Saat, gute Ernte’, ‘gute’, 1, ‘i’)

FROM dual;

 

—Результат: 2

В этом примере будет возвращено количество раз, когда в строке появляется слово ‘gute’. Поиск выполняется без учета регистра, поэтому в результате 2 вхождения.

Oracle PL/SQL

SELECT REGEXP_COUNT (‘Gute Saat, gute Ernte’, ‘gute’, 5, ‘i’)
FROM dual;

—Результат: 1



SELECT REGEXP_COUNT (‘Gute Saat, gute Ernte’, ‘gute’, 5, ‘i’)

FROM dual;

 

—Результат: 1

В этом примере будет возвращено количество раз, когда слово ‘gute’ появляется в строке, начиная с позиции 5. В этом случае результат = 1, потому что перед поиском шаблона он пропустит первые 4 символа в строке.

Теперь давайте посмотрим, как мы будем использовать функцию REGEXP_COUNT со столбцом таблицы и искать несколько символов.

Например:

Oracle PL/SQL

SELECT REGEXP_COUNT (other_comments, ‘the’, 1, ‘i’)
FROM contacts;

—Результат: 3



SELECT REGEXP_COUNT (other_comments, ‘the’, 1, ‘i’)

FROM contacts;

 

—Результат: 3

В этом примере мы будем подсчитывать количество появления «the» в поле other_comments в таблице contacts.

Пример сопоставления нескольких альтернатив.

Следующий пример, который мы рассмотрим, включает использование | pattern. | pattern используется как «ИЛИ», чтобы указать несколько альтернатив.

Например:

Oracle PL/SQL

SELECT REGEXP_COUNT (‘AeroSmith’, ‘a|e|i|o|u’)
FROM dual;

—Результат: 3



SELECT REGEXP_COUNT (‘AeroSmith’, ‘a|e|i|o|u’)

FROM dual;

 

—Результат: 3

Этот пример вернет 3, потому что он подсчитывает количество гласных (a, e, i, o или u) в строке ‘AeroSmith’. Поскольку мы не указали значение match_parameter, функция REGEXP_COUNT будет выполнять поиск с учетом регистра, что означает, что ‘A’ в ‘AeroSmith’ не будет считаться.

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

Oracle PL/SQL

SELECT REGEXP_COUNT (‘AeroSmith’, ‘a|e|i|o|u’, 1, ‘i’)
FROM dual;

—Результат: 4



SELECT REGEXP_COUNT (‘AeroSmith’, ‘a|e|i|o|u’, 1, ‘i’)

FROM dual;

 

—Результат: 4

Теперь, поскольку мы указали start_position = 1 и match_parameter = ‘i’, запрос вернет в качестве результата 4. На этот раз ‘A’ в ‘AeroSmith’ будет включена в счет.

Теперь давайте посмотрим, как мы будем использовать эту функцию со столбцом.

Итак, допустим, у нас есть таблица контактов со следующими данными:

contact_idlast_name
1000AeroSmith
2000Joy
3000Scorpions

Теперь давайте запустим следующий запрос:

Oracle PL/SQL

SELECT contact_id, last_name, REGEXP_COUNT (last_name, ‘a|e|i|o|u’, 1, ‘i’) AS total
FROM contacts;



SELECT contact_id, last_name, REGEXP_COUNT (last_name, ‘a|e|i|o|u’, 1, ‘i’) AS total

FROM contacts;

Результаты, которые будут возвращены запросом:

contact_idlast_name total
1000AeroSmith4
2000Joy1
3000Scorpions3

Выборка определенного количества символов в SQL запросе

 
Константин_
 
(2006-07-26 10:30)
[0]

Как выбрать определенное количество символов в sql запросе начиная с конца поля, например «123456» > «3456»
С уважением.


 
ЮЮ ©
 
(2006-07-26 10:40)
[1]

В MS SQL: RIGHT(<строка>, <количество>)
У других серверов, наверняка, что-то найдется подобное.
В стандарте, имхо, такого нет. Лишь SUBSTRING, т.е. подйдет, если количество симолов в значениях поля одинаковое и известное


 
Константин_
 
(2006-07-26 11:03)
[2]

select cast(dogovor as char(3)) from pred.dbf where cast(dogovor as int)>1000
В таком запросе получается выборка 3 символов с начала строки, а может его можно как то изменить?


 
Desdechado ©
 
(2006-07-26 11:31)
[3]

Видимо, намек указать СУБД не понят.


 
ЮЮ ©
 
(2006-07-26 11:35)
[4]

БД какая?

В таком запросе получается выборка 3 символов с начала строки, а может его можно как то изменить?

С начал строки, естественно, проблем нет, коль есть Substring()


 
Константин_
 
(2006-07-26 11:47)
[5]

выборка производиться из талицы DBase IV при помощи компонента Query


 
ЮЮ ©
 
(2006-07-26 11:48)
[6]

SELECT dogovor from pred.dbf where cast(dogovor as int) < 10000
         /* 1 — 4х значные*.
UNION ALL
SELECT Substring(dogovor from 2 for 4) FROM pred.dbf
 where cast(dogovor as int) BETWEEN 10000 AND 99999
    /* для 5-начных*/
UNION ALL
. .. и так далее

З.Ы. зачем такие важные последнии символа слис со столь маловажными первыми в одом поле? Раздели, пока не поздно


 
ЮЮ ©
 
(2006-07-26 11:50)
[7]

З.Ы. Как будешь различать договора 123456 и 213456 после такого запроса?


 
Константин_
 
(2006-07-26 11:52)
[8]

Работа ведеться с водомерным счетчиком, а у него есть такая особенность перекручиваться… очень не хорошая.
Спасибо за помощь.


 
Константин_
 
(2006-07-26 11:53)
[9]

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


 
ЮЮ ©
 
(2006-07-26 12:01)
[10]


> а у него есть такая особенность перекручиваться. .. очень
> не хорошая.

У него наверное всего 4 числа то и есть и для него естественно «перекручиваться», а вот откуда в базе появляются неестественные 5-е цифры?


 
Константин_
 
(2006-07-26 12:04)
[11]

начальные показания 9985 последние показания 0010 в баз 10010


 
ЮЮ ©
 
(2006-07-26 12:20)
[12]

Ну и откуда эта 1 в базе?

следующее показание будет 0100, а у тебя уже предыдущее 10010. Опять перекрутка нужна? Или пририсовка?

Может лучше оставлять как есть 0010?
А при расчетах учитывать возможность «перекрутки»


 
Константин_
 
(2006-07-26 12:26)
[13]

Можно было бы оставить. .. но прога уже в эксплуатации… недоглядел, теперь мучаюсь


sql server — Подсчет общего количества символов в таблице SQL

спросил

Изменено
3 года, 10 месяцев назад

Просмотрено
1к раз

Я хочу подсчитать общее количество символов в таблице.

Я знаю, как это сделать для одного столбца:

 выберите сумму (длина)
из (
    выберите длину (столбец) как длину
    со стола
) как Всего
 

Но как сделать это для каждого столбца в таблице?

Я придумал один из способов:

 выбрать сумму (len (col1) + len (col2) + len (3) + ...) как TotalChracters
из таблицы
 

Но мне нужно сделать это для более чем 500 таблиц, и в каждой таблице много столбцов. Я надеялся на общий код, который работает для одной таблицы, которую я могу легко перебрать в Python, просто меняя имя таблицы в каждом цикле.

  • sql
  • sql-сервер

6

У меня есть код, который не выполняет запрос, но он почти такой же, как и желаемый код для любого количества таблиц и столбцов в вашей БД.
Кроме того, включает ISNULL, поэтому, если таблица пуста, будет отображаться 0:

 WITH CTE AS (
ВЫБЕРИТЕ T.Name как Table_Name,
    C.Name как Column_Name,
    ROW_NUMBER() OVER (PARTITION BY T.Name ORDER BY T.Name, C.Name) AS RowASC,
    ROW_NUMBER() OVER (PARTITION BY T.Name ORDER BY T.Name, C.Name DESC) AS RowDESC
ИЗ системных объектов T
ВНУТРЕННЕЕ СОЕДИНЕНИЕ системных столбцов C
  ВКЛ T.ID = C.ID
ГДЕ T.XType = 'U'
)
ВЫБРАТЬ *,
    СЛУЧАЙ, КОГДА RowASC = 1 THEN 'SELECT ISNULL(SUM('ELSE'' END +
    СЛУЧАЙ, КОГДА RowASC = 1 THEN 'LEN('+Имя_столбца+')' ELSE '+LEN('+Имя_столбца+')' END +
    CASE WHEN RowDESC = 1 THEN '), 0) AS [Всего символов в таблице: '+Table_Name+']
    FROM '+Table_Name +' UNION 'ELSE'' END AS Query
ИЗ КТЭ
ORDER BY Table_Name, Column_Name;
 

Просто нужно скопировать столбец справа (Запрос) и вставить в новое окно запроса.

4

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

SQL Server Helper — функция подсчета вхождений символов

Главная  >  Определяемые пользователем функции  > Функция подсчета вхождений символов

Функция подсчета вхождений символов

Первый вариант

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

 СОЗДАТЬ ФУНКЦИЮ [dbo].[ufn_CountChar] ( @pInput VARCHAR(1000), @pSearchChar CHAR(1))
ВОЗВРАЩАЕТ INT
НАЧИНАТЬ

ОБЪЯВИТЬ @vInputLength INT
ОБЪЯВИТЬ @vIndex INT
ОБЪЯВИТЬ @vCount INT

УСТАНОВИТЕ @vCount = 0
УСТАНОВИТЕ @vIndex = 1
УСТАНОВИТЬ @vInputLength = LEN(@pInput)

ПОКА @vIndex <= @vInputLength
НАЧИНАТЬ
    ЕСЛИ ПОДСТРОКА(@pInput, @vIndex, 1) = @pSearchChar
        УСТАНОВИТЬ @vCount = @vCount + 1

    УСТАНОВИТЬ @vIndex = @vIndex + 1
КОНЕЦ

ВОЗВРАТ

КОНЕЦ
ИДТИ
 

Описание

Как видно из определяемой пользователем функции, она перебирает каждый символ
во входной строке (ПОКА @vIndex <= @vInputLength) и сравнивает строковый символ с входным поисковый символ (IF SUBSTRING(@pInput, @vIndex, 1) = @pSearchChar). Если они одинаковые, счетчик увеличивается на 1 (SET @vCount = @vCount + 1).


Второй вариант

Вот еще один способ определить, сколько раз встречается определенный символ.
в заданной строке без использования цикла.

 СОЗДАТЬ ФУНКЦИЮ [dbo].[ufn_CountChar] ( @pInput VARCHAR(1000), @pSearchChar CHAR(1))
ВОЗВРАЩАЕТ INT
НАЧИНАТЬ

RETURN (LEN(@pInput) - LEN(REPLACE(@pInput, @pSearchChar, '')))

КОНЕЦ
ИДТИ
 

Описание

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

Чтобы дополнительно проиллюстрировать метод, выполняемый определяемой пользователем функцией, давайте
скажем, у вас есть строковое значение «Быстрая коричневая лиса перепрыгивает через ленивую собаку».
и вы хотите определить, сколько раз буква «о» встречается в
нить. Первый шаг, который он делает, это замена символа поиска, в
в этом случае буква "o" с пустым символом/строкой. Итак
результирующая строка после REPLACE будет "The quick brwn fx jumps ver the
lazy dg." Теперь мы вычитаем длину полученной строки, которая равна
40 от длины исходной входной строки, равной 44, и это дает
us 4, что является количеством "о" в заданном строковом значении.

Третий вариант

Предыдущая версия определяемой пользователем функции "Подсчет вхождения символов"
нечувствительный к регистру. Если мы хотим подсчитать количество букв «t» в нижнем регистре
из того же строкового значения, что и выше, оно даст нам значение 2, а не просто
возвращаемое значение 1, потому что он будет считать первую букву «t», даже если она находится в
верхний регистр. Чтобы сделать определяемую пользователем функцию чувствительной к регистру, она должна
изменить следующим образом:

 СОЗДАТЬ ФУНКЦИЮ [dbo].[ufn_CountChar] ( @pInput VARCHAR(1000), @pSearchChar CHAR(1))
ВОЗВРАЩАЕТ INT
НАЧИНАТЬ

RETURN (LEN(@pInput) - LEN(REPLACE(@pInput COLLATE SQL_Latin1_General_Cp1_CS_AS,
                                   @pSearchChar COLLATE SQL_Latin1_General_Cp1_CS_AS, '')))

КОНЕЦ
ИДТИ
 

Описание

Эта версия определяемой пользователем функции "Подсчет появления символов" аналогична
как предыдущая версия, но с небольшой модификацией, чтобы сделать ее
деликатный случай.