【问题标题】:How do I do a case sensitive comparison in sql?如何在sql中进行区分大小写的比较?
【发布时间】:2009-07-30 12:09:43
【问题描述】:

刚开始为初学者编写 SQL 教程。我现在正在做一些练习,我想知道如何更改标题。

如果你看这里:你会看到我已经创建了名字、姓氏、头衔、年龄和薪水。我用小写字母写了这些字母。 怎么改成大写?

http://tinypic.com/r/amtpgm/3

我试过用这个:

update mytablename 
set firstname = 'Firstname'
where firstname = 'firstname'

但后来我发现这个不行。

谢谢

====

其他问题:

我还注意到,如果我用空格书写,那么它不会被识别。它只是将显示的第一部分。你知道它为什么会这样吗?谢谢

create table myemployees_tr0214
(First Name varchar(20),
Last Name varchar(20),
Title char(5),
Age number(3),
Salary number(6,10));

===========

感谢您的所有投入。 我已经尝试过将“Firstname”重命名为“Fname”,但没有成功。我错过了什么吗?

alter table myemployees_tr0214
rename column Firstname to Fname;

【问题讨论】:

  • 这是真的作业吗?
  • @tomfanning:不,这不是作业。我正在为 sql 初学者做一个在线教程。在我的测试表上创建和插入信息时,我意识到我为表插入了小写字母标题,如果我想将其更改为大写怎么办。我在教程中还没有遇到过。
  • SQL 标准没有定义区分大小写,它依赖于数据库

标签: sql syntax


【解决方案1】:

这应该将表中的所有名字更新为大写首字母:

UPDATE mytablename SET firstname = CONCAT(UCASE(MID(firstname,1,1)),MID(firstname,2));

希望对你有帮助:)

【讨论】:

  • @Paul Janaway:这只会改变我专栏的标题吗?谢谢
  • 如果这就是您的意思,它不会更改字段名称,它会更改字段中的数据。假设您在字段中输入名字:paul, bob, peter.. 它会将它们更改为 Paul, Bob, Peter
【解决方案2】:

首先,除非您真的想要更改字段的名称,否则不要。如果您所做的只是学习 SQL,那么这并不是那么重要。请注意,如果您想学习这样做的语法,那么这当然是一个值得练习的练习,但除此之外,我会顺其自然。

您编辑的问题提到在名称中使用空格。这是不允许的。构成“SQL 标识符”的规则,无论是表名、列名、约束等,都有一些严格的规则,简化为只能使用字母、下划线和数字,但可以'不要以数字开头。

现在,为什么你用来学习 SQL 的在线网站在添加这些空格时没有抱怨,我不知道,这让我有点怀疑。听起来好像它实际上并没有使用已知的数据库引擎,因为这些空格的存在 + 额外的单词会使任何正常的数据库引擎抱怨语法错误。

为了解决这个问题,要么添加下划线而不是空格,要么收缩并使用驼峰式,如下所示:FirstName,LastName

【讨论】:

  • 不推荐。我熟悉的 RDBMS 将允许列名中有空格,如果它们被引用的话。创建表 T ("DO NO DO THIS" varchar(10))
【解决方案3】:

啊,有两种方法可以阅读这个问题。第一个是基于阅读您发布的示例更新。这将失败,因为默认情况下 SQL 不对字符串进行区分大小写的比较。

第二段代码暗示您想要的是 ALTER TABLE 并将列名从具有一种大小写的列名称更改为另一种。在 MS-SQL 中,如果不删除整个表并重新创建它,就无法做到这一点,在其他 SQL 方言中,会有版本特定的 DDL 语法。

最后,在 MS-Access 中,如果列名有空格,则将其括在双引号中,例如SQL中的“我的专栏”将其包装在[我的专栏]中

【讨论】:

    【解决方案4】:
    update mytablename set firstname = 'Firstname'; where firstname = 'firstname';
    

    这将更新 firstname 列的 。您要做的是更改 firstname 列的名称。如何执行此操作取决于您使用的数据库(您没有提到)。

    如果是MS Access或者SQL server,可以在UI中打开表格,使用设计器修改列名。

    否则,您可以使用 SQL ALTER TABLE 语句,如here 所述。

    【讨论】:

    • @Joe:我正在使用来自该网站sqlcourse.com 的 SQL 解释器。昨天推荐给我的。不确定它是 Ms Access 还是 SQL Server。我认为它的 SQL Server
    【解决方案5】:

    对于 MS SQL Server...

    您可以使用 [ 和 ] 来分隔标识符:

    create table myemployees_tr0214 (
      [First Name] varchar(20),  --here
      [Last Name] varchar(20),  --here
      Title char(5),
      Age number(3),
      Salary number(6,10)
    );
    

    如果要将列名从“firstname”更改为“Firstname”,可以在 MS SQL Server 中使用 sp_rename。

    如果您想更改“名字”列中数据的第一个字母,其他发帖人已经提供了解决方案,这里还有一个用于单个名称的解决方案。

    update mytablename 
    set firstname = 'Firstname'
    where firstname COLLATE Latin1_general_Bin = 'firstname' COLLATE Latin1_general_Bin
    

    【讨论】:

      【解决方案6】:

      如果您使用的是 mysql,请参阅:http://dev.mysql.com/doc/refman/5.0/en/charset-binary-op.html

      BINARY 运算符转换字符串 跟随它到一个二进制字符串。这 是一种强制比较的简单方法 逐字节完成,而不是 一个字一个字。二进制也 导致尾随空格 意义重大

      mysql> SELECT 'a' = 'A';
              -> 1
      mysql> SELECT BINARY 'a' = 'A';
              -> 0
      mysql> SELECT 'a' = 'a ';
              -> 1
      mysql> SELECT BINARY 'a' = 'a ';
              -> 0
      

      【讨论】:

        【解决方案7】:

        您需要某种唯一的行标识符,例如 id,以便您可以这样做

        update mytablename set firstname = 'Firstname' where id = 1
        

        现在可以用作唯一行标识符的是naturalsurrogate 键的巨大争论。使用您认为最适合您的示例的方法,但我是代理键的支持者,因为每个自然键都有可能更改。

        【讨论】:

        • @Mladen Prajdic:感谢您的意见。还没有听说过 natural 和 surrogate。也许我很快就会遇到。听起来很复杂,我想我得重新创建我的表和而不是写小写字母,我会把它改成大写字母。也许对于像我这样的初学者来说,它现在很好。谢谢
        【解决方案8】:

        这可能需要进行更多优化,但它甚至可以让您更新多个名字的 MSSQL 版本

        select 'mary ellen' as firstname into #test
        insert into #test select 'Nathan'
        
        
        select 
        Case when patindex('% %',firstname) >0 then
        upper(left(firstname,1)) --first letter
        + rtrim(substring(firstname,2,patindex('% %',firstname)-1)) --whole firstname
        + ' ' -- space
        + Upper(substring(firstname,patindex('% %',firstname)+1,1)) --first letter last name
        +  rtrim(substring(firstname,patindex('% %',firstname)+2, len(firstname)))
        else
        upper(left(firstname,1)) + substring(firstname,2,len(firstname))
        end as firstname
        from #test
        
        
        update #test
        set firstname = Case when patindex('% %',firstname) >0 then
        upper(left(firstname,1)) --first letter
        + rtrim(substring(firstname,2,patindex('% %',firstname)-1)) --whole firstname
        + ' ' -- space
        + Upper(substring(firstname,patindex('% %',firstname)+1,1)) --first letter last name
        +  rtrim(substring(firstname,patindex('% %',firstname)+2, len(firstname)))
        else
        upper(left(firstname,1)) + substring(firstname,2,len(firstname))
        end 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-03
          • 2012-06-03
          • 2011-01-09
          相关资源
          最近更新 更多