2009-07-30 87 views
3

刚刚为初学者开始了SQL教程。我现在正在做一些练习,我想知道如何更改标题。如何在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)); 

==========

感谢您对您的所有投入。 我已经尝试将这个名称重命名为“Fname”,并没有奏效。我错过了什么?

alter table myemployees_tr0214 
rename column Firstname to Fname; 
+0

这是真的功课? – tomfanning 2009-07-30 12:12:07

+0

@tomfanning:不,这不是一项家庭作业。我正在为sql初学者做一个在线教程。在我的测试表上创建和插入信息时,我意识到我插入了表格的小写字母,如果我想将它改为大写字母,该怎么办?我还没有在教程中遇到过它。 – tintincutes 2009-07-30 12:14:12

+0

区分大小写不是由SQL标准定义的,它依赖于数据库 – skaffman 2009-07-30 12:35:50

回答

1

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

第二段代码暗示了你想要的是ALTER TABLE,并将列的名称从一个列名更改为另一个。在MS-SQL中,如果不删除整个表并重新创建它,则不能这样做,在SQL的其他方言中,将存在特定于版本的DDL语法。

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

0

你需要某种形式的唯一行indentifier像ID的,所以你可以做

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

现在什么可以用来作为唯一的行indentifier是natural VS surrogate键的巨大争论。使用你认为最适合你的例子,但我是密钥的支持者,因为每个自然键都有可能改变。

+0

@Mladen Prajdic:感谢您的输入。还没有听说过自然和代理。可能很快我会遇到那个。听起来很复杂,我想我我必须重新创建我的桌子,而不是写小字母,我会将其改为首信。也许对于像我这样的初学者来说,它现在是好的。谢谢 – tintincutes 2009-07-30 12:16:35

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

这将更新值名字列的。你想要做的是改变名字列的名字。如何做到这一点取决于你使用的数据库(你没有提到)。

如果是MS Access或SQL Server,可以在UI中打开表格并使用设计器更改列名称。

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

+0

@Joe:我使用本网站http://sqlcourse.com的SQL解释器。它昨天向我推荐。不太确定它的Ms Access或SQL Server。我认为它的SQL Server – tintincutes 2009-07-30 12:18:13

3

这应该更新表中的所有firstnames一个首字母大写:

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

希望这有助于你:)

2

首先,除非你真的改的名字领域,不要。如果你只是在学习SQL,那并不重要。请注意,如果你想学习这样做的语法,那么当然这将是一个有价值的练习,但除此之外,我会让它成为。

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

现在,为什么您用来学习SQL的在线网站在您添加这些空间时并不抱怨,我不知道,而对我而言,这使得它有点可疑。听起来好像它实际上使用了一个已知的数据库引擎,因为只有那些空格的存在+额外的单词会使任何普通的数据库引擎抱怨糟糕的语法。

为了解决这个问题,无论是加下划线代替空格,或合同,并使用驼峰规则,这样的:名字,姓氏

1

对于MS SQL服务器...

你会使用[和]来界定标识符:

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

如果要列名从“名字”,以“名字”改变,你可以在MS SQL Server的请使用sp_rename。

如果您想更改“firstname”列中数据的第一个字母,其他海报提供了解决方案,这里是另一个名称。

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

如果你使用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 
0

这可能需要优化更多,但它可以让你即使更新多张名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