2013-04-09 154 views
0

我有一个有趣的SQL Server搜索要求。SQL Server 2008 select语句忽略非字母数字字符

说我有一个零件编号表如下:

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

如何创建一个搜索,如果我搜索,比方说,对于“D12A”将返回的结果吗?

我现在有一个完整的文本搜索设置为描述列,但我希望找到不匹配,甚至在一部分部件时,用户不包括/或 - 等

我会而是在单个SQL语句中执行此操作,而不是在可能的情况下创建函数,因为我们只能读取数据库。

回答

1

你可以这样做:

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

这会为你工作指定的2个字符,并可以扩展为多个字符,像这样:

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