У меня есть столбец, значения которого отформатированы как a, b, c, d. Есть ли способ подсчитать количество запятых в этом значении в T-SQL?
sql-server
tsql
Орион Адриан
источник
источник
LTRIM
вокруг строки следующим образом :SELECT LEN(RTRIM(@string)) - LEN(REPLACE(RTRIM(@string), ',', ''))
?Быстрое расширение ответа cmsjr, которое работает со строками из более чем одного символа.
Использование:
источник
dbo.CountOccurancesOfString( 'blah ,', ',')
вернет 2 вместо 1 иdbo.CountOccurancesOfString( 'hello world', ' ')
потерпит неудачу с делением на ноль.DATALENGTH()/2
также сложно из-за неочевидных размеров символов. Посмотрите на stackoverflow.com/a/11080074/1094048 для простого и точного способа.Вы можете сравнить длину строки с той, где запятые удалены:
источник
Основываясь на решении @ Andrew, вы получите гораздо лучшую производительность, используя непроцедурную табличную функцию и CROSS APPLY:
источник
Ответ @csmjr имеет проблему в некоторых случаях.
Его ответом было сделать это:
Это работает в большинстве сценариев, однако попробуйте запустить это:
По какой-то причине REPLACE избавляется от последней запятой, но ТАКЖЕ и непосредственно перед ней (не знаю почему). Это приводит к возвращаемому значению 5, когда вы ожидаете 4. Вот другой способ сделать это, который будет работать даже в этом специальном сценарии:
Обратите внимание, что вам не нужно использовать звездочки. Подойдет любая двухсимвольная замена. Идея состоит в том, что вы удлиняете строку на один символ для каждого экземпляра счетного символа, а затем вычитаете длину оригинала. Это в основном противоположный метод первоначального ответа, который не сопровождается странным побочным эффектом обрезки.
источник
источник
Принятый ответ является правильным, расширяя его, чтобы использовать 2 или более символа в подстроке:
источник
Если мы знаем, что есть ограничение на LEN и пространство, почему мы не можем сначала заменить пространство? Тогда мы знаем, что нет места, чтобы запутать ЛЕН.
источник
источник
Даррел Ли, я думаю, имеет довольно хороший ответ. Замените
CHARINDEX()
наPATINDEX()
, и вы также можете выполнить слабыйregex
поиск по строке ...Как, скажем, вы используете это для
@pattern
:Почему вы хотите сделать что-то сумасшедшее?
Допустим, вы загружаете текстовые строки с разделителями в промежуточную таблицу, где поле, содержащее данные, является чем-то вроде varchar (8000) или nvarchar (max) ...
Иногда проще / быстрее выполнить ELT (Extract-Load-Transform) с данными, а не ETL (Extract-Transform-Load), и один из способов сделать это - загрузить записи с разделителями как есть в промежуточную таблицу, особенно если Вы можете захотеть более простой способ увидеть исключительные записи, чем рассматривать их как часть пакета служб SSIS ... но это священная война для другого потока.
источник
Следующее должно сделать трюк как для поиска одного символа, так и для поиска нескольких символов:
Функция может быть немного упрощена с помощью таблицы чисел (dbo.Nums):
источник
Используйте этот код, он работает отлично. Я создал функцию sql, которая принимает два параметра, первый параметр - это длинная строка, которую мы хотим найти в ней, и она может принимать длину строки до 1500 символов (конечно, вы можете расширить ее или даже изменить на тип данных text). ). А вторым параметром является подстрока, по которой мы хотим вычислить номер ее вхождения (его длина составляет до 200 символов, конечно, вы можете изменить его на то, что вам нужно). и вывод является целым числом, представляющим число частот ..... наслаждайтесь этим.
источник
Наконец, я пишу эту функцию, которая должна охватывать все возможные ситуации, добавляя префикс char и суффикс к входу. этот символ оценивается как отличный от любого символа, указанного в параметре поиска, поэтому он не может повлиять на результат.
использование
источник
источник
В SQL 2017 или выше вы можете использовать это:
источник
этот код T-SQL находит и печатает все вхождения шаблона @p в предложении @s. Вы можете сделать любую обработку предложения позже.
результат: 1 6 13 20
источник
для SQL Server 2017
источник
Вы можете использовать следующую хранимую процедуру для получения значений.
источник
@c1
ответ, который ему требуется. Какая польза от остальной части кода, учитывая, что ему нужна уже существующая таблица, призваннаяtable1
работать, имеет жестко закодированный разделитель и ее нельзя использовать в строке, как принятый ответ за два месяца до этого?Тест Replace / Len хорош, но, вероятно, очень неэффективен (особенно с точки зрения памяти). Простая функция с циклом сделает работу.
источник
Возможно, вам не следует хранить данные таким образом. Не рекомендуется хранить список с разделителями-запятыми в поле. Это очень неэффективно для запросов. Это должна быть связанная таблица.
источник