Оператор выбора 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