如何在许多观察中检测字符串中的数字?

时间:2017-05-02 08:09:31

标签: sql sql-server

我想从Name中检测所有数字以获取ID。我使用这段代码:

  select Name, ID
  from [my_table]
  where [Name] like ('%000234%')

但我需要为许多名字工作。我尝试过像(000234,000235,...)中的名字,但它不起作用。是否有可能获得按姓名搜索的完整ID列表?

4 个答案:

答案 0 :(得分:2)

如果要为特定数字范围选择名称

select Name, ID
from [my_table]
where [Name] like '%00023[4-9]%'

将搜索名称000234 - 000239

其他wild card reference

答案 1 :(得分:0)

将数据插入临时表。然后你可以将它与主表合并。

DECLARE @TempTable TABLE (TempName NVARCHAR(10))
INSERT INTO @TempTable        
VALUES 
('000234'),
('000235')


SELECT 
    A.Name, 
    A.ID
FROM 
    [my_table] A INNER JOIN 
    @TempTable B ON A.Name LIKE '%' + B.TempName + '%'

答案 2 :(得分:0)

为了清晰起见,添加了测试表。

CREATE TABLE #Test (
    NameString varchar(25) )

INSERT INTO #Test (NameString)
SELECT 'Mike387592'
UNION ALL 
SELECT 'Nancy2387'
UNION ALL 
SELECT 'Tim0088297234'

WITH CTE AS (
    SELECT
         NameString
        ,PATINDEX('%[0-9]%', NameString) AS [Start]
        ,LEN(NameString) AS [End]
    FROM #Test )

SELECT 
     NameString
    ,SUBSTRING(NameString, [Start], [End]) 
FROM CTE

答案 3 :(得分:0)

如果表中有大量名称具有非顺序编号且其中没有共享模式的名称,则收集该数据的一种方法是使用IN谓词并动态构建查询。

E.G。你想要名字号码为000412,001523& 001687。

您可以动态生成如下查询:

SELECT Name, ID
FROM [my_table]
WHERE Name IN ( '000412', '001523', '001687' )

动态查询可以从数据库或调用数据库的软件生成,但主要是不鼓励,因为它们构成安全威胁而且不可重用。不过,这是一个选择。

如果必须使用LIKE谓词,因为数字字符串周围还有其他字符,这样的内容就是生成的查询:

SELECT Name, ID
FROM [my_table]
WHERE Name LIKE '%000412%' OR
      Name LIKE '%001523%' OR
      Name LIKE '%001687%'