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

Sql 如何在许多观察中检测字符串中的数字?,sql,sql-server,Sql,Sql Server,我想检测从姓名到ID的所有数字。我使用以下代码: select Name, ID from [my_table] where [Name] like ('%000234%') 但我需要为很多人工作。我尝试了(000234000235,…)中的名称,但它不起作用。是否可以按名称搜索整个ID列表?如果要为特定范围的数字选择名称 select Name, ID from [my_table] where [Name] like '%00023[4-9]%' 它将搜索名称000234-0

我想检测从姓名到ID的所有数字。我使用以下代码:

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

但我需要为很多人工作。我尝试了(000234000235,…)中的名称,但它不起作用。是否可以按名称搜索整个ID列表?

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

select Name, ID
from [my_table]
where [Name] like '%00023[4-9]%'
它将搜索名称
000234
-
000239


对于其他

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

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 + '%'

为了清晰起见,增加了测试表

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

如果一个表中有大量的名称具有非序列号,并且这些名称之间没有共享的模式,那么收集这些数据的一种方法是使用in谓词并动态构造查询

例如,您希望名称的编号为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%'

如果名称仅为数字,则需要使用筛选器,[name]值实际上是什么样子的。您是否需要在LIKE谓词中使用通配符(例如,您的名字中有值而不是数字),或者我们可以完全放弃LIKE谓词,只使用一个数字字符串?不幸的是,我有大约100个数字来搜索数据库中的ID。但是没有后续的问题。我可以将它们复制粘贴到代码中,但是一个接一个地选择它们并运行查询是很累人的。因此,我正在搜索一些代码以简化过程。由于您只查找数字,您可以尝试
where[Name]如“[0-9][^a-z]]”
,它只过滤数字而不过滤字母。不幸的是,我之前的评论是一个错误,这将生成第一个字符为0-9的记录,第二个字符是非a-z的任何字符,而第四个字符是任何字符。您可以尝试
其中[Name]像“[0-9][0-9][0-9][0-9][0-9][0-9]”
这将产生6个数字名称字符。我的名字是例如:'Shirt S blue N-0000234',我有很多不同的数字。我将尝试结合您的答案:)