Удаление всех алфавитов из строки с использованием одного SQL Query [duplicate]

Это старый остаток от дней, когда для отличия выражений от операторов был больше синтаксического сахара.

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

В списке элементов Java использует явное ключевое слово null, но «нулевой оператор» является просто пустым линия. Разрешение существования пустой строки - это удержание из традиции, унаследованной от C.

Зачем? Особенно с инструкцией if, когда вы знаете, что никакие утверждения не выполняются: поскольку некоторые операторы if имеют побочные эффекты:

 int c;
 if ((c = in.read()) != -1);

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

5
задан Codingo 20 September 2012 в 01:39
поделиться

4 ответа

Сценарий RichardTheKiwi в функции для использования в selects without cross apply также добавляется, потому что в моем случае я использую его для двойных и денежных значений в поле varchar

CREATE FUNCTION dbo.ReplaceNonNumericChars (@string VARCHAR(5000))
RETURNS VARCHAR(1000)
AS 
    BEGIN
        SET @string = REPLACE(@string, ',', '.')
        SET @string = (SELECT   SUBSTRING(@string, v.number, 1)
                       FROM     master..spt_values v
                       WHERE    v.type = 'P'
                                AND v.number BETWEEN 1 AND LEN(@string)
                                AND (SUBSTRING(@string, v.number, 1) LIKE '[0-9]'
                                     OR SUBSTRING(@string, v.number, 1) LIKE '[.]')
                       ORDER BY v.number
                      FOR
                       XML PATH('')
                      )
        RETURN @string
    END
GO

Спасибо RichardTheKiwi +1

3
ответ дан Pierre 19 August 2018 в 18:10
поделиться

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

SELECT REPLACE(REPLACE(REPLACE(LOWER(col),'a',''),'b',''),'c','')
  FROM dbo.table...

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

3
ответ дан Aaron Bertrand 19 August 2018 в 18:10
поделиться
  • 1
    Да ... закончил так. Согласитесь, это уродливо, хотя – Codingo 20 September 2012 в 02:24
  • 2
    Функция T-SQL будет не намного лучше, просто выглядит лучше в запросе. Теперь CLR, с другой стороны, позволит вам делать такие вещи, намного более аккуратные с RegEx. – Aaron Bertrand 20 September 2012 в 02:28
  • 3
    Я полностью согласен - проект с учетом времени, хотя :) – Codingo 20 September 2012 в 02:29
  • 4
    @Aaron, @Michael Я думаю, что более сжатое решение TSQL по-прежнему возможно ... Если экзотические символы находятся в строке или не уверены, этот ответ должен будет включать REPLACE(..,Char(244),'') и т. Д. – RichardTheKiwi 20 September 2012 в 02:37

CTE для HELP здесь.

;WITH CTE AS 
(
SELECT 

      [ProductNumber] AS OrigProductNumber
      ,CAST([ProductNumber] AS VARCHAR(100)) AS [ProductNumber]           
FROM [AdventureWorks].[Production].[Product]
UNION ALL
SELECT OrigProductNumber
       ,CAST(STUFF([ProductNumber], PATINDEX('%[^0-9]%', [ProductNumber]), 1, '') AS VARCHAR(100) ) AS [ProductNumber]
FROM CTE WHERE PATINDEX('%[^0-9]%', [ProductNumber]) > 0 
)

SELECT * FROM CTE
WHERE PATINDEX('%[^0-9]%', [ProductNumber]) = 0   
OPTION (MAXRECURSION 0)

вывод:

OrigProductNumber   ProductNumber
WB-H098                 098
VE-C304-S               304
VE-C304-M               304
VE-C304-L               304
TT-T092                 092
5
ответ дан ClearLogic 19 August 2018 в 18:10
поделиться

Вы можете сделать это в одном заявлении. Вы действительно не создаете инструкцию с 200 + REPLACE, вы?!

update tbl
set S = U.clean
from tbl
cross apply
(
    select Substring(tbl.S,v.number,1)
    -- this table will cater for strings up to length 2047
    from master..spt_values v
    where v.type='P' and v.number between 1 and len(tbl.S)
    and Substring(tbl.S,v.number,1) like '[0-9]'
    order by v.number
    for xml path ('')
) U(clean)

Working SQL Fiddle , показывающий этот запрос с образцами данных

Replicated ниже для потомков:

create table tbl (ID int identity, S varchar(500))
insert tbl select 'asdlfj;390312hr9fasd9uhf012  3or h239ur ' + char(13) + 'asdfasf'
insert tbl select '123'
insert tbl select ''
insert tbl select null
insert tbl select '123 a 124'

Результаты

ID  S
1   390312990123239
2   123
3   (null)
4   (null)
5   123124
12
ответ дан RichardTheKiwi 19 August 2018 в 18:10
поделиться
  • 1
    +1 более умный, чем мой, но если есть только алфавитные символы, которые нужно заменить, вложенные замены немного легче понять. :-) – Aaron Bertrand 20 September 2012 в 02:37
  • 2
    Ты прав. Я просто использовал этот шаблон, который раньше использовал для очистки определенных групп символов (другое предложение WHERE), поэтому я подумал, что буду использовать его повторно. – RichardTheKiwi 20 September 2012 в 02:40
  • 3
    +1 за умение! На данный момент у вас самый лучший сценарий, протестировано более 20 скриптов - все остальные либо не поддерживаются стандартами SQL 2005, либо Super slow. – Pierre 20 June 2013 в 09:40
Другие вопросы по тегам:

Похожие вопросы: