sql-server - Шаблон Regex внутри функции SQL Replace? Функция replace sql


Функция SQL REPLACE, как заменить одну букву MS SQL Server

Попробуйте сделать это наоборот, если вы не хотите, чтобы новые «y» стали «z»:

REPLACE(REPLACE(cc.contype,'y','z'),'x','y') as ContractType

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

replace(replace(cc.contype,'y','z'),'x','y') as ContractType,

Это преобразует все y символы в z до преобразования символов x в y .

Если вы выполните более общее решение, вы можете сделать объединенные запросы, например:

select 'Signed: ' || cc.contype as ContractType wherecc.contype like 'C%' from wherever union all select 'Estimate: ' || cc.contype as ContractType where cc.contype like 'E%' from wherever

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

Некоторые СУБД фактически будут запускать эти подзапросы параллельно для повышения эффективности.

Конечно, идеальным решением является изменение вашей схемы, чтобы вам не приходилось обрабатывать под-столбцы. contype колонку contype на две части, сохранив первый символ в contype_first и contype_rest .

Тогда всякий раз, когда вам нужен полный contype :

select contype_first || contype_rest ...

Для вашего текущего запроса вы можете использовать таблицу поиска:

lookup_table: first char(1) primary key description varchar(20)

содержащий:

first description ----- ----------- C Signed: E Estimate:

и запрос:

select lkp.description || cc.contype_rest from lookup_table lkp, real_table cc where lkp.first = cc.first ...

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

Даже если вы не можете заменить один столбец двумя независимыми столбцами, вы можете, по крайней мере, создать два новых и использовать триггер insert / update, чтобы синхронизировать их. Это дает вам старый способ и новый улучшенный способ доступа к информации о contype .

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

sqlserver.bilee.com

sql - Функция REPLACE в T-SQL 2008 отличается от T-SQL 2005

Я работаю над проектом миграции баз данных с SQL Server 2005 на 2008.

Во время теста я обнаружил одно несоответствие. В соответствии с BOL http://msdn.microsoft.com/en-us/library/ms186862(v=SQL.100).aspx (2008) и http://msdn.microsoft.com/en-us/library/ms186862(v=SQL.90).aspx (2005) возвращает varchar. Пока оба одинаковы. Однако, если мы перейдем к столбцу функции REPLACE типа char, тогда произойдет различие. Посмотрите на этот код

declare @test table ( testcharstring char(25) ) insert into @test select 'Hello' union select 'World' union select 'Hello world ' select '"'+testcharstring+'"' as original ,'"'+replace(testcharstring,'a','A')+'"' as afterreplace --,'"'+replace(rtrim(testcharstring),'a','A')+'"' from @test

Результат SQL Server 2005

original afterreplace --------------------------- --------------------------- "Hello " "Hello" "Hello world " "Hello world" "World " "World"

Результат SQL Server 2008

original afterreplace --------------------------- --------------------------- "Hello " "Hello " "Hello world " "Hello world " "World " "World "

T-SQL в SQL Server 2005 удаляет даже законное конечное пространство, не говоря уже об угрозах char(25) как varchar(25). T-SQL в SQL Server 2008 приближается к типу более тщательно и возвращает результаты в соответствии с типом, который он получает для преобразования

У меня есть число мест в разных объектах T-SQL, в основном в триггерах. Основная идея - просто внести минимальные изменения, чтобы поддерживать такое же поведение в SQL Server 2008

Возможные способы сделать это

  • Переопределить встроенную функцию REPLACE Быстрый поиск предполагает, что это невозможно, однако мой товарищ по команде хочет изучить эту опцию
  • Используйте Rtrim() функции вместе с REPLACE. Это потребует замены в точном месте кода в нескольких процедурах (где используются столбцы char).
  • Создание собственной версии Заменить в CLR, чтобы увидеть, что CLR позволяет мне сохранять поведение SQL Server 2005, а затем снова искать и заменять функцию в точном месте

Я хотел бы спросить всех, если кто-нибудь столкнется с этим вопросом, как вы это разработали?

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

Заранее благодарю!

qaru.site

sql-server - Шаблон Regex внутри функции SQL Replace?

Вы можете использовать PATINDEX чтобы найти первый индекс возникновения шаблона (строки). Затем используйте STUFF для заполнения другой строки в соответствии с шаблоном (строкой).

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

DECLARE @counter int SET @counter = 0 WHILE(@counter < (SELECT MAX(ID_COLUMN) FROM Table)) BEGIN WHILE 1 = 1 BEGIN DECLARE @RetVal varchar(50) SET @RetVal = (SELECT Column = STUFF(Column, PATINDEX('%[^0-9.]%', Column),1, '') FROM Table WHERE ID_COLUMN = @counter) IF(@RetVal IS NOT NULL) UPDATE Table SET Column = @RetVal WHERE ID_COLUMN = @counter ELSE break END SET @counter = @counter + 1 END

Внимание! Это медленно! Наличие столбца varchar может повлиять. Поэтому использование LTRIM RTRIM может немного помочь. Несмотря на это, это происходит медленно.

Кредит идет на this ответ .

EDIT Credit также отправляется на @srutzky

Редактировать (by @Tmdean) Вместо того, чтобы делать по одной строке за раз, этот ответ можно адаптировать к более сложному решению. Он по-прежнему повторяет максимальное количество нечисловых символов в одной строке, поэтому он не идеален, но я думаю, что он должен быть приемлемым в большинстве ситуаций.

WHILE 1 = 1 BEGIN WITH q AS (SELECT ID_Column, PATINDEX('%[^0-9.]%', Column) AS n FROM Table) UPDATE Table SET Column = STUFF(Column, q.n, 1, '') FROM q WHERE Table.ID_Column = q.ID_Column AND q.n != 0; IF @@ROWCOUNT = 0 BREAK; END;

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

DECLARE @done bit = 0; WHILE @done = 0 BEGIN WITH q AS (SELECT ID_Column, PATINDEX('%[^0-9.]%', Column) AS n FROM Table WHERE COALESCE(Scrubbed_Column, 0) = 0) UPDATE Table SET Column = STUFF(Column, q.n, 1, ''), Scrubbed_Column = 0 FROM q WHERE Table.ID_Column = q.ID_Column AND q.n != 0; IF @@ROWCOUNT = 0 SET @done = 1; -- if Scrubbed_Column is still NULL, then the PATINDEX -- must have given 0 UPDATE table SET Scrubbed_Column = CASE WHEN Scrubbed_Column IS NULL THEN 1 ELSE NULLIF(Scrubbed_Column, 0) END; END;

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

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

WHILE 1 = 1 BEGIN UPDATE dbo.YourTable SET Column = Replace(Column, Substring(Column, PatIndex('%[^0-9.-]%', Column), 1), '') WHERE Column LIKE '%[^0-9.-]%' If @@RowCount = 0 BREAK; END;

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

Если вы делаете это только для параметра, входящего в хранимую процедуру, вы можете использовать следующее:

while PatIndex('%[^0-9]%', @Param) > 0 select @Param = Replace(@Param, Substring(@Param, PatIndex('%[^0-9]%', @Param), 1), '')

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

Пример времени выполнения нескольких ответов, основанных на запущенных рекурсивных запросах на основе набора или скалярной функции, основанный на наборе тестов 1 м строк, удаляющих символы из случайного newid, варьируется от 34 до 2 м05 для примеров цикла WHILE и от 1 м3 до { навсегда} для примеров функций.

Использование функции та

code-examples.net

sql - Почему эта функция sql не работает с REPLACE?

У меня возникла проблема с моей функцией sql. Следующая функция работает так, как ожидается, но когда я подставляю ее, она возвращает только одну строку:

CAST(t.ColumnName as nvarchar(100))

для:

REPLACE(CAST(t.ColumnName as nvarchar(100)), 'ID', 'Id')

Что не так? Вот мой код:

PRINT dbo.CreatePocoFromTable('dbo.OnePoundFish')

Вот сама функция:

CREATE FUNCTION [dbo].[CreatePocoFromTable] (@SchemaAndName nvarchar(200)) RETURNS Nvarchar(MAX) AS BEGIN /* Example call: PRINT dbo.CreatePocoFromTable('dbo.OnePoundFish') */ DECLARE @TableName NVARCHAR(100) = SUBSTRING(@SchemaAndName , CHARINDEX('.', @SchemaAndName ) + 1, LEN(@SchemaAndName )) DECLARE @TableSchema NVARCHAR(100) = SUBSTRING(@SchemaAndName , 1, CHARINDEX('.', @SchemaAndName ) - 1) DECLARE @result Nvarchar(max) = '' SET @result = @result + 'using System;' + CHAR(13) + CHAR(13) IF (@TableSchema IS NOT NULL) BEGIN SET @result = @result + 'namespace ' + @TableSchema + CHAR(13) + '{' + CHAR(13) END SET @result = @result + 'public class ' + @TableName + CHAR(13) + '{' + CHAR(13) SET @result = @result + '#region Instance Properties' + CHAR(13) SELECT @result = @result + CHAR(13) -- BL/DAL/DataRepository Entity attributes + '[DataField("' + t.ColumnName + '")]' + CHAR(13) + ' public ' + t.ColumnType + ' ' + CAST(t.ColumnName as nvarchar(100)) + ' { get; set; } ' + CHAR(13) FROM ( SELECT c.COLUMN_NAME AS ColumnName , CASE c.DATA_TYPE WHEN 'bigint' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Int64?' ELSE 'Int64' END WHEN 'binary' THEN 'Byte[]' WHEN 'bit' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Boolean?' ELSE 'Boolean' END WHEN 'char' THEN 'String' WHEN 'date' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'datetime' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'datetime2' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'datetimeoffset' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTimeOffset?' ELSE 'DateTimeOffset' END WHEN 'decimal' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END WHEN 'float' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Single?' ELSE 'Single' END WHEN 'image' THEN 'Byte[]' WHEN 'int' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Int32?' ELSE 'Int32' END WHEN 'money' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END WHEN 'nchar' THEN 'String' WHEN 'ntext' THEN 'String' WHEN 'numeric' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END WHEN 'nvarchar' THEN 'String' WHEN 'real' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Double?' ELSE 'Double' END WHEN 'smalldatetime' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'smallint' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Int16?' ELSE 'Int16'END WHEN 'smallmoney' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END WHEN 'text' THEN 'String' WHEN 'time' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'TimeSpan?' ELSE 'TimeSpan' END WHEN 'timestamp' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END WHEN 'tinyint' THEN CASE C.IS_NULLABLE WHEN 'YES' THEN 'Byte?' ELSE 'Byte' END WHEN 'uniqueidentifier' THEN 'Guid' WHEN 'varbinary' THEN 'Byte[]' WHEN 'varchar' THEN 'String' ELSE 'Object' END AS ColumnType , c.ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS c WHERE c.TABLE_NAME = @TableName and ISNULL(@TableSchema, c.TABLE_SCHEMA) = c.TABLE_SCHEMA ) t ORDER BY t.ORDINAL_POSITION SET @result = @result + CHAR(13) + '#endregion Instance Properties' + CHAR(13) SET @result = @result + '}' + CHAR(13) IF (@TableSchema IS NOT NULL) BEGIN SET @result = @result + CHAR(13) + '}' END RETURN @Result END

Благодаря :)

источник поделиться

qaru.site

Функция REPLACE | SQL Программирование

Функция REPLACE, существующая во всех трех рассматриваемых СУБД, возвращает символьную строку, в которой все вхождения выражения2 заменены выражениемЗ. Приведем пример. Этот запрос вернул результат bb12bbbb12bbbb12, поскольку все вхождения символов aa заменялись символами bb12. Для запуска этого запроса в Microsoft SQL Server 2008 просто удалите предложение FROM. Для запуска в IBM DB2 9.5 замените таблицу dual на sysibm. sysdummy1. Для тиражирования одного или нескольких символов используют функции REPLICATE или REPEAT (они применимы в СУБД DB2 9.5 и Microsoft SQL Server). В Oracle аналогичная функциональность достигается с помощью комбинации функций LPAD и RPAD. В следующем примере (синтаксис DB2 9.5) функция REPEAT возвращает строку, в которой слово repeat повторяется три раза (причем без пробела между отдельными словами). Предел длины результирующей строки определяется типом данных аргумента. Максимальное число повторений не должно превышать предела целочисленного значения в системе (в 32-разрядных компьютерах это 2147483647). Аналогичный результат в Microsoft SQL Server можно получить с помощью следующего запроса. А вот пример использования функции Oracle RPAD для тиражирования строки. В данном примере второй аргумент определяет общую длину результирующей строки, функция LENGTH применяется для измерения длины исходной строки, а множитель 3 указывает на количество повторений. Это достаточно удобная версия функции REPLACE. Для поиска и замены символов в строке в ней используются шаблоны. В следующем примере все цифры заменяются нулями, а все буквы, за исключением K, — звездочками; сама же буква K заменяется на Х. Данную функцию полезно использовать в целях безопасности. К примеру, если в базе данных содержатся конфиденциальные данные (скажем, номера кредитных карточек), в отчетах их выводить совершенно не обязательно. В следующем примере номер кредитной карточки заменяется звездочками.

Похожие публикации

new-techs.ru

Символьные / строчные функции SQL Server — Oracle PL/SQL •MySQL •SQL Server

Наименование Описание
SQL Server функция ASCII В SQL Server (Transact-SQL) функция ASCII возвращает числовой код, который представляет указанный символ.
SQL Server функция CHAR В SQL Server (Transact-SQL) функция CHAR является противоположной функции ASCII. Возвращает символ, основанный на числовом коде.
SQL Server функция CHARINDEX В SQL Server (Transact-SQL) функция CHARINDEX возвращает местоположение подстроки в строке. Поиск не чувствителен к регистру.
SQL Server функция CONCAT В SQL Server (Transact-SQL) функция CONCAT позволяет соединять строки.
SQL Server конкатенация с символом + В SQL Server (Transact-SQL) конкатенация с символом + позволяет объединить две или более строки вместе.
SQL Server функция DATALENGTH В SQL Server (Transact-SQL) функция DATALENGTH возвращает длину выражения в байтах.
SQL Server функция LEFT В SQL Server (Transact-SQL) функция LEFT извлекает подстроку из строки, начиная с самого левого символа.
SQL Server функция LEN В SQL Server (Transact-SQL) функция LEN возвращает длину указанной строки. Важно отметить, что функция LEN не включает символы пробела в конце строки.
SQL Server функция LOWER В SQL Server (Transact-SQL) функция LOWER преобразует все буквы в указанной строке в нижний регистр. Если в строке есть символы, которые не являются буквами, они не зависят от этой функции.
SQL Server функция LTRIM В SQL Server (Transact-SQL) функция LTRIM удаляет все пробелы из левой части строки.
SQL Server функция NCHAR В SQL Server (Transact-SQL) функция NCHAR возвращает символ Unicode на основе number_code в стандарте Unicode.
SQL Server функция PATINDEX В SQL Server (Transact-SQL) функция PATINDEX возвращают местоположение шаблона в строке. Поиск не чувствителен к регистру.
SQL Server функция REPLACE В SQL Server (Transact-SQL) функция REPLACE заменяет последовательность символов в строке другим набором символов, и не чувствительна к регистру.
SQL Server функция RIGHT В SQL Server (Transact-SQL) функция RIGHT извлекает подстроку из строки, начиная с самого правого символа.
SQL Server функция RTRIM В SQL Server (Transact-SQL) функция RTRIM удаляет все пробелы из правой части строки.
SQL Server функция SPACE В SQL Server (Transact-SQL) функция SPACE возвращает строку с заданным количеством пробелов.
SQL Server функция STR В SQL Server (Transact-SQL) функция STR возвращает строковое представление числа.
SQL Server функция STUFF В SQL Server (Transact-SQL) функция STUFF удаляет последовательность символов из исходной строки и затем вставляет другую последовательность символов в исходную строку, начиная с указанной позиции.
SQL Server функция SUBSTRING В SQL Server (Transact-SQL) функция SUBSTRING позволяют извлекать подстроку из строки.
SQL Server функция UPPER В SQL Server (Transact-SQL) функция UPPER преобразует все буквы указанной строки в верхний регистр. Если в строке есть символы, которые не являются буквами, они не зависят от этой функции.

oracleplsql.ru