SQL Server 2008 查询以查找列中包含非字母数字字符的行

Posted

技术标签:

【中文标题】SQL Server 2008 查询以查找列中包含非字母数字字符的行【英文标题】:SQL Server 2008 query to find rows containing non-alphanumeric characters in a column 【发布时间】:2010-12-27 13:06:09 【问题描述】:

实际上几周前我自己也被问过这个问题,而我确切地知道如何使用 SP 或 UDF 执行此操作,但我想知道如果没有这些方法,是否有一种快速简便的方法来执行此操作。我假设有,但我找不到它。

我需要说明的一点是,尽管我们知道允许使用哪些字符(az、AZ、0-9),但我们不想指定不允许使用的字符(#@!$等等...)。此外,我们希望提取 具有 非法字符的行,以便将其列出给用户进行修复(因为我们无法控制输入过程,我们此时无能为力)。

我之前浏览过 SO 和 Google,但无法找到符合我要求的任何内容。我见过很多例子,它们可以告诉你它是否包含字母数字字符,但是能够在我在查询表单中找不到的句子中提取撇号的东西。

另请注意,此 varchar 列中的值可以是 null''(空)。

【问题讨论】:

什么版本的 SQL Server?这听起来像是一个正则表达式工作 @OMG Ponies 我已经更新了这个主题,它更像是“我想知道你怎么能做到这一点”,而不是特定系统所需要的,但为了简单起见,我们只能说它是 2008 年。 【参考方案1】:

这样不行吗?

SELECT * FROM TABLE
WHERE COLUMN_NAME LIKE '%[^a-zA-Z0-9]%'

设置

use tempdb
create table mytable ( mycol varchar(40) NULL)

insert into mytable VALUES ('abcd')
insert into mytable VALUES ('ABCD')
insert into mytable VALUES ('1234')
insert into mytable VALUES ('efg%^&hji')
insert into mytable VALUES (NULL)
insert into mytable VALUES ('')
insert into mytable VALUES ('apostrophe '' in a sentence') 

SELECT * FROM mytable
WHERE mycol LIKE '%[^a-zA-Z0-9]%'

drop table mytable 

结果

mycol
----------------------------------------
efg%^&hji
apostrophe ' in a sentence

【讨论】:

LIKE 不支持正则表达式,只支持通配符。而且我们不知道目前是什么版本.. 我们不需要正则表达式来解决这个问题。除非我错过了什么。 让我改一下 - 我们不需要完整的 RegEx 支持。使用 LIKE 支持的简单模式匹配(或 PATINDEX)就足够了。我们只需要找到一个不在允许列表中的字符。 本可以发誓我在某个时候这样做了,我有点假设因为 '' 不包含任何会返回的字母数字字符。谢谢大家,这就是答案:) 对我来说,我的数据库不区分大小写,所以COLUMN_NAME LIKE '%[^a-zA-Z0-9]%'COLUMN_NAME LIKE '%[^A-Z0-9]%'COLUMN_NAME LIKE '%[^a-z0-9]%' 相同【参考方案2】:

Sql 服务器对正则表达式的支持非常有限。您可以将 PATINDEX 与类似的东西一起使用

PATINDEX('%[a-zA-Z0-9]%',Col)

看看PATINDEX (Transact-SQL)

和Pattern Matching in Search Conditions

【讨论】:

如果你想使用 PATINDEX,你需要这样做: "SELECT * FROM mytable WHERE PATINDEX('%[^a-zA-Z0-9]%',mycol) > 1 " 是的,这是正确的。在列列表中选择它只会显示值的位置。 这就是我用它来删除特定列中非拉丁字符的行的方法: delete FROM [DefaultConnection].[dbo].[AspNetUsers] where PATINDEX('%[a-zA-Z0 -9]%',国家) = 0【参考方案3】:

我发现this 页面有一个非常简洁的解决方案。让它变得很棒的是,你可以知道角色是什么以及它在哪里。然后它提供了一种超级简单的方法来修复它(可以组合并内置到一段驱动程序代码中以扩展它的应用程序)。

DECLARE @tablename VARCHAR(1000) ='Schema.Table'
DECLARE @columnname VARCHAR(100)='ColumnName'
DECLARE @counter INT = 0
DECLARE @sql VARCHAR(MAX)

WHILE @counter <=255
BEGIN

SET @sql=

'SELECT TOP 10 '+@columnname+','+CAST(@counter AS VARCHAR(3))+' as CharacterSet, CHARINDEX(CHAR('+CAST(@counter AS VARCHAR(3))+'),'+@columnname+') as LocationOfChar
FROM '+@tablename+'
WHERE CHARINDEX(CHAR('+CAST(@counter AS VARCHAR(3))+'),'+@columnname+') <> 0'

PRINT (@sql)
EXEC (@sql)
SET @counter = @counter + 1
END

然后……

UPDATE Schema.Table
SET ColumnName= REPLACE(Columnname,CHAR(13),'')

归功于 Ayman El-Ghazali。

【讨论】:

【参考方案4】:
SELECT * FROM TABLE_NAME WHERE COL_NAME LIKE '%[^0-9a-zA-Z $@$.$-$''''$,]%'

当我尝试在字符串中查找任何特殊字符时,这最适合我

【讨论】:

如果有西里尔文、希腊文、汉字怎么办?

以上是关于SQL Server 2008 查询以查找列中包含非字母数字字符的行的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 请求中,如何查找字符串最后一部分中包含数字的所有记录(最后一个空格之后)

MySQL中包含数学比较的SQL查询

SQL Server 索引中包含查询字段 (INCLUDE索引)

SQL Server如何查找表名或列名中包含空格的表和列

SQL Server 2008 R2:查找两列之间的链接和链

优化 SQL Server 2008 查询