web-dev-qa-db-ja.com

列に英数字以外の文字を含む行を検索するSQL Server 2008クエリ

実際に数週間前に自分でこれを尋ねられましたが、SPまたはUDFでこれを行う方法を正確に知っていますが、これらを使わずにこれを行う簡単な方法があるかどうか疑問に思っていましたメソッドが存在することを想定していますが、見つけることができません。

私がする必要がある点は、許可されている文字(az、AZ、0-9)はわかっていますが、許可されていないものを指定したくない(#@!$など)です。 。)。また、have不正な文字である行をプルして、修正するためにユーザーにリストできるようにします(入力プロセスを制御できないため、その時点では何もできません)。

私は以前にSOとGoogleに目を通しましたが、私が望んだことをするものを見つけることができませんでした。英数字が含まれているかどうかを示すことができる多くの例を見てきました。しかし、クエリ形式で見つけられなかった文のアポストロフィを引き出すことができる何か。

値はnullまたは''(空)このvarchar列。

33
Jay

これはしませんか?

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
61
beach

SQLサーバーでは、正規表現のサポートが非常に制限されています。このようなものでPATINDEXを使用できます

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

PATINDEX(Transact-SQL) をご覧ください

および 検索条件でのパターン一致

8
Adriaan Stander

私は 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),'')

アイマン・エル・ガザリの功績。

2
wwmbes