Sql 如何在许多观察中检测字符串中的数字?
我想检测从姓名到ID的所有数字。我使用以下代码: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
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',我有很多不同的数字。我将尝试结合您的答案:)