【问题标题】:How to find values in all caps in SQL Server?如何在 SQL Server 中查找所有大写字母中的值?
【发布时间】:2011-12-31 11:19:07
【问题描述】:

如何找到全部大写的列值?喜欢LastName = 'SMITH' 而不是'Smith'

这是我正在尝试的...

SELECT *
  FROM MyTable
 WHERE FirstName = UPPER(FirstName)

【问题讨论】:

  • 应该可以。你得到了什么结果?
  • @Polynomial,我得到的结果与我运行“WHERE FirstName = FirstName”时的结果相同......也许编码需要不同(如果有意义的话.. idk 我在说什么差不多)

标签: sql sql-server uppercase


【解决方案1】:

您可以强制区分大小写排序;

select * from T
  where fld = upper(fld) collate SQL_Latin1_General_CP1_CS_AS

【讨论】:

    【解决方案2】:

    试试

     SELECT *
      FROM MyTable
     WHERE FirstName = UPPER(FirstName) COLLATE SQL_Latin1_General_CP1_CS_AS
    

    这种排序规则允许区分大小写的比较。

    如果您想更改数据库的排序规则以便不需要在查询中指定区分大小写的排序规则,您需要执行以下操作 (from MSDN):

    1) 确保您拥有重新创建用户数据库以及其中的所有对象所需的所有信息或脚本。

    2) 使用 bcp Utility 等工具导出所有数据。

    3) 删除所有用户数据库。

    4) 重建 master 数据库,在 setup 命令的 SQLCOLLATION 属性中指定新的排序规则。例如:

    Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName 
    /SQLSYSADMINACCOUNTS=accounts /[ SAPWD= StrongPassword ] 
    /SQLCOLLATION=CollationName
    

    5) 创建所有数据库和其中的所有对象。

    6) 导入所有数据。

    【讨论】:

      【解决方案3】:

      您需要使用区分大小写的服务器排序规则,如下所示:

      SELECT * 
      FROM MyTable
      WHERE FirstName = UPPER(FirstName) Collate SQL_Latin1_General_CP1_CS_AS
      

      【讨论】:

        【解决方案4】:

        默认情况下,SQL 比较不区分大小写。

        【讨论】:

          【解决方案5】:

          试试

          SELECT *
            FROM MyTable
           WHERE FirstName = LOWER(FirstName)
          

          【讨论】:

            【解决方案6】:

            您可以尝试将其用作您的 where 子句吗?

            WHERE PATINDEX(FirstName + '%',UPPER(FirstName)) = 1
            

            【讨论】:

              【解决方案7】:

              看看here

              看来你有几个选择

              • 将字符串转换为 VARBINARY(length)

              • 使用 COLLATE 指定区分大小写的排序规则

              • 计算要比较的字符串的 BINARY_CHECKSUM()

              • 更改表格列的 COLLATION 属性

              • 使用计算列(VARBINARY 的隐式计算)

              【讨论】:

                【解决方案8】:

                试试这个

                SELECT *
                FROM MyTable
                WHERE UPPER(FirstName) COLLATE Latin1_General_CS_AS = FirstName COLLATE Latin1_General_CS_AS
                

                【讨论】:

                  【解决方案9】:

                  【讨论】:

                    【解决方案10】:

                    为此我创建了一个简单的UDF

                    create function dbo.fnIsStringAllUppercase(@input nvarchar(max)) returns bit
                    
                        as
                    
                    begin
                    
                        if (ISNUMERIC(@input) = 0 AND RTRIM(LTRIM(@input)) > '' AND @input = UPPER(@input COLLATE Latin1_General_CS_AS))
                            return 1;
                    
                        return 0;
                    end
                    

                    然后您可以轻松地在WHERE 子句中的任何列上使用它。

                    使用 OP 示例:

                    SELECT *
                    FROM   MyTable
                    WHERE  dbo.fnIsStringAllUppercase(FirstName) = 1
                    

                    【讨论】:

                      【解决方案11】:

                      回答这个问题的简单方法是使用排序规则。让我试着解释一下:

                      SELECT *
                        FROM MyTable
                       WHERE FirstName COLLATE SQL_Latin1_General_CP1_CI_AS='SMITH’
                      

                      在上面的查询中,我使用了 collat​​e 并且没有使用任何内置的 sql 函数,例如“UPPER”。原因是因为使用内置函数有其自身的影响。

                      请找到链接以更好地理解:

                      performance impact of upper and collate

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2010-09-18
                        • 1970-01-01
                        • 2022-09-27
                        • 2016-08-30
                        • 2017-07-29
                        • 2019-02-15
                        相关资源
                        最近更新 更多