Оператор выбора SQL Server 2008, который игнорирует не буквенно-цифровые символы

У меня есть интересное требование поиска SQL Server.

Скажем, у меня есть таблица с номерами деталей следующим образом:

PARTNO    DESCRIPTION
------    -----------
ABC-123   First part
D/12a92   Second Part

Как я могу создать поиск, который будет возвращать результаты, если я ищу, скажем, "D12A"?

В настоящее время у меня настроен полнотекстовый поиск для столбца описания, но я ищу, чтобы найти детали, которые не соответствуют этой части, даже если пользователи не включают / или - и т. Д.

Я бы предпочел сделать это в одном операторе SQL, а не создавать функции, если это возможно, поскольку у нас есть доступ только для чтения к БД.

1 ответ

Решение

Вы могли бы сделать что-то вроде:

SELECT * FROM PART_TABLE
WHERE REPLACE(REPLACE(PARTNO,'/', ''),'-','') LIKE '%D12A%'

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

SELECT * FROM PART_TABLE
WHERE REPLACE(REPLACE(REPLACE(PARTNO,'/', ''),'-',''),*,'') LIKE '%D12A%'

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

Вот пример такой функции:

CREATE FUNCTION dbo.udf_AlphaNumericChars
(
@String     VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN

  DECLARE @RemovingCharIndex INT
  SET @RemovingCharIndex = PATINDEX('%[^0-9A-Za-z]%',@String)

  WHILE @RemovingCharIndex > 0
  BEGIN
    SET @String = STUFF(@String,@RemovingCharIndex,1,'')
    @RemovingCharIndex = PATINDEX('%[^0-9A-Za-z]%',@String)
  END

  RETURN @String

END


------- Query Sample (untested)---------
SELECT *
FROM PART_TABLE
WHERE DBO.udf_AlphaNumericChars(PARTNO) LIKE '%D12A%'

Взято из: http://sqlserver20.blogspot.co.uk/2012/06/find-alphanumeric-characters-only-from.html

Другие вопросы по тегам