如何只输出列的非数字部分

时间:2013-04-04 15:53:36

标签: sql sql-server

我有一个名为TCODE的列,其值类似于5T,6545H,25和S4444。 现在我只想要返回的4行中只有3行,只有那些列T,H或S的非数字位。表名是CODES。

伪代码 从CODES中选择TCODE,我在其中删除存在数字和非数字混合的那些列的数字部分。

预期结果

TCODE 
T
H
S

我该怎么做?

4 个答案:

答案 0 :(得分:1)

在SQL Server中,您可以使用PATINDEX:

SELECT SUBSTRING(TCODE,PATINDEX('%[^0-9]%', TCODE),1)
FROM CODES
WHERE PATINDEX('%[^0-9]%',TCODE) > 0

答案 1 :(得分:0)

我想到的方式是相当野蛮的:

select replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(tcode, '0', ''),
                                                                               '1', 0),
                                                                       '2', 0),
                                                                '3', 0),
                                                       '4', 0),
                                               '5', 0),
                                       '6', 0),
                                '7', 0),
                         '8', 0),
                 '9', 0) as theletters
  . . .

您可以将其放入子查询中,然后选择where theletters <> ''进行过滤。

答案 2 :(得分:0)

另一种选择:

with cte as
(select 0 n, replace(tcode,'0','') tcode from codes
 union all
 select n+1 n, replace(tcode,convert(varchar,n+1),'') tcode
 from cte
 where n<9)
select tcode from cte
where n=9

(SQLFiddle here

答案 3 :(得分:0)

您可以创建这样的功能

CREATE FUNCTION RemoveDigits(@strText VARCHAR(1000))
RETURNS VARCHAR(1000)
AS
BEGIN
    WHILE PATINDEX('%[0-9]%', @strText) > 0
    BEGIN
        SET @strText = STUFF(@strText, PATINDEX('%[0-9]%', @strText), 1, '')
    END
    RETURN @strText
END
GO

然后使用它

SELECT dbo.RemoveDigits(TCODE) TCODE
  FROM CODES
 WHERE PATINDEX('%[^0-9]%', TCODE) > 0

输出:

| TCODE |
---------
|     T |
|     H |
|     S |

<强> SQLFiddle