T-SQL查找小写和大写的字符串

时间:2016-08-25 15:46:16

标签: tsql

我有一个包含多个表格的数据库,我需要在数据库中搜索每个 varchar列,以查找同时包含大写和小写字符的列。

澄清:

如果一列包含helLo,则查询应返回列名称,但如果列值仅包含helloHELLO然后不返回列的名称。

4 个答案:

答案 0 :(得分:7)

让我们排除所有UPPER和所有LOWER,其余的将被混合。

SELECT someColumn
FROM someTable
WHERE someColumn <> UPPER(someColumn) AND someColumn <> LOWER(someColumn) 

修改

根据建议in comments并详细说明here我需要指定区分大小写的排序规则。

SELECT someColumn
FROM someTable
WHERE someColumn <> UPPER(someColumn) AND 
      someColumn <> LOWER(someColumn) 
      Collate SQL_Latin1_General_CP1_CS_AS

答案 1 :(得分:3)

听起来好像是在进行区分大小写的搜索之后,因此您需要对WHERE子句使用区分大小写的排序规则。

e.g。如果您的排序规则当前是SQL_Latin1_General_CP1_CI_AS(不区分大小写),则可以使用以下命令编写区分大小写的查询:

SELECT SomeColumn
FROM dbo.SomeTable
WHERE SomeField LIKE '%helLo%' COLLATE SQL_Latin1_General_CP1_CS_AS

此处,COLLATE SQL_Latin1_General_CP1_CS_AS告诉它使用区分大小写的排序规则来执行过滤。

答案 2 :(得分:0)

您可以检查哈希值与其上限值和下限值的比较...这是一个简单的测试:

impl T for A, B {
    fn double(&self) -> u32 {
        /* ... */
    }
}

所以在表中使用它......你可以做这样的事情

declare @test varchar(256)
set @test = 'MIX' -- Try changing this to a mix case, and then all lower case

select case
            when hashbytes('SHA1',@test) <> hashbytes('SHA1',upper(@test)) and hashbytes('SHA1',@test) <> hashbytes('SHA1',lower(@test))
            then 'MixedCase'
            else 'Not Mixed Case'
        end

答案 3 :(得分:0)

我想我明白你想找到任何包含混合案例数据的varchar列吗?

如果是这样,您可以使用cursor查看列类型来实现此目的,然后在它找到的varchar列上执行一些动态SQL,以检查数据是否为混合大小写值。

我完全建议您使用数据库副本在非生产服务器上执行此操作,这不仅仅是因为您需要创建一个表格以将结果存入:

create table VarcharColumns (TableName nvarchar(max), ColumnName nvarchar(max))

declare @sql nvarchar(max)

declare my_cursor cursor local static read_only forward_only
for 
select 'insert into VarcharColumns select t,c from(select ''' + s.name + '.' + tb.name + ''' t, ''' + c.name + ''' c from ' + s.name + '.' + tb.name + ' where ' + c.name + ' like ''%[abcdefghijklmnopqrstuvwxyz]%'' COLLATE SQL_Latin1_General_CP1_CS_AS and ' + c.name + ' like ''%[ABCDEFGHIJKLMNOPQRSTUVWXYZ]%'' COLLATE SQL_Latin1_General_CP1_CS_AS having count(1) > 0) a' as s
from sys.columns c
    inner join sys.types t
        on(c.system_type_id = t.system_type_id
            and t.name = 'varchar'
            )
    inner join sys.tables tb
        on(c.object_id = tb.object_id)
    inner join sys.schemas s
        on(tb.schema_id = s.schema_id)

open my_cursor
fetch next from my_cursor into @sql
while @@fetch_status = 0
begin 
    print @sql
    exec(@sql)
    fetch next from my_cursor into @sql
end
close my_cursor
deallocate my_cursor

select * from VarcharColumns