【问题标题】:Getting upper into lower case将大写变为小写
【发布时间】:2015-03-24 09:02:52
【问题描述】:

在我的 SELECT 语句中,我有:

,用户名

当它出现在查询中时,它显示为:JOHN.SMITH

是否可以使用 CAST 或 CONVERT 将其更改为 John Smith?

感谢任何建议。

谢谢。

【问题讨论】:

  • 在php中你可以使用ucwords php.net/manual/en/function.ucwords.php
  • 或者这可以帮助你。 joellipman.com/articles/sql/t-sql/…
  • 假设这是为了向用户显示更具可读性的信息,为什么不存储一个友好的名称以显示给用户(就像他们的真实姓名一样?)
  • AFAIK..没有 sql-server 内置函数可以做到这一点,你可能需要编写一些函数,然后在你的操作中使用它们

标签: tsql ssrs-2008-r2


【解决方案1】:

先用空格替换句点:

SELECT REPLACE(SELECT UserName FROM YourTable, '.', ' ')

将此保存在变量中,或将此选择直接放入下面的函数中。

很遗憾,我现在没有可用的 t-sql,所以我无法检查语法是否 100% 正确。

然后只将第一个字符设置为大写。如果你使用 oracle,我会告诉你使用 initcap,但这在 t-sql 中不存在。

取自链接:http://www.devx.com/tips/Tip/17608

create function initcap (@text varchar(4000))
returns varchar(4000)
as

begin
    declare     @counter int, 
        @length int,
        @char char(1),
        @textnew varchar(4000)

    set @text       = rtrim(@text)
    set @text       = lower(@text)
    set @length     = len(@text)
    set @counter    = 1

    set @text = upper(left(@text, 1) ) + right(@text, @length - 1) 

    while @counter <> @length --+ 1
    begin
        select @char = substring(@text, @counter, 1)

        IF @char = space(1)  or @char =  '_' or @char = ','  or @char = '.' or @char = '\'
 or @char = '/' or @char = '(' or @char = ')'
        begin
            set @textnew = left(@text, @counter)  + upper(substring(@text, 
@counter+1, 1)) + right(@text, (@length - @counter) - 1)
            set @text    = @textnew
        end

        set @counter = @counter + 1
    end

    return @text
end

所以使用这个函数来转换大写字符串。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    你可以这样做:

    DECLARE @UserName AS varchar(50) = 'JOHN.SMITH'

    SELECT LEFT(UPPER(LEFT(@UserName, CHARINDEX('.', @UserName)-1)),1) + SUBSTRING(LOWER(LEFT(@UserName, CHARINDEX('.', @UserName)-1)),2,LEN(LEFT(@UserName, CHARINDEX('.', @UserName)-1))-1) + ' ' + LEFT(UPPER(RIGHT(@UserName, LEN(@UserName) - CHARINDEX('.', @UserName))),1) + SUBSTRING(LOWER(RIGHT(@UserName, LEN(@UserName) - CHARINDEX('.', @UserName))),2,LEN(RIGHT(@UserName, LEN(@UserName) - CHARINDEX('.', @UserName)))-1)
    

    它获取. 之前的所有内容,然后将第一个字母向上,同时降低其余字母,然后对. 之后的所有内容执行相同操作。

    但是,如果您在代码中处理此问题会更好,因为当您再次阅读此查询时,您可能不知道它在做什么。

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多