【问题标题】:Sql server rtrim not working for me, suggestions?Sql server rtrim 不适合我,建议?
【发布时间】:2012-09-17 02:12:04
【问题描述】:

我有点惊讶我找不到快速解决我所面临的问题的方法,这似乎是一件很常见的事情。我无法摆脱选择查询中的尾随空格。我想将数据放入 csv 文件中。如果这更容易的话,我很乐意从 SSMS“结果到文本”中复制/粘贴结果。无论哪种方式,我的查询是:

declare @maxDate date = (select MAX(TradeDate) from tblDailyPricingAndVol)

select p.Symbol, ','
from tblDailyPricingAndVol p
where p.Volume > 1000000 and p.Clse <= 40 and p.TradeDate = @maxDate
order by p.Symbol

然后它返回:

A       ,
AA      ,
ABB     ,

等等。 p.Symbol 字段周围的 Rtrim 没有帮助。如果我能找出最佳解决方案,我会得到以下结果:

A,AA,ABB

等等。有接盘侠吗?一如既往地提前感谢..

【问题讨论】:

    标签: sql sql-server sql-server-2008 sql-server-2008-r2


    【解决方案1】:

    p.Symbol 被定义为 CHAR(8),并且 CHAR 值不能被修剪。修剪前转换为 N/VARCHAR(8)。

    【讨论】:

    • 如果源列是CHAR,为什么要NVARCHAR(而不是VARCHAR)?
    • @devio 谢谢...我刚试过:选择 rtrim(cast(p.Symbol as varchar(8))) 没有运气。
    【解决方案2】:

    从您的预期结果来看,您似乎想将所有行中的 symbol 值连接成一个逗号分隔字符串。

    为了做到这一点,你可以这样做:-

    DECLARE @str VARCHAR(MAX)
    SELECT @str = COALESCE(@str+',' ,'') + LTRIM(RTRIM((p.Symbol)))
    FROM tblDailyPricingAndVol p
    WHERE p.Volume > 1000000 and p.Clse <= 40 and p.TradeDate = @maxDate
    ORDER by p.Symbol
    SELECT @str
    GO
    

    其他替代方法也可以参考here

    关于RTRIM 不起作用的问题,这似乎很奇怪。为了安全起见,我在上述查询中添加了LTRIM + RTRIM。但是,只要您的symbol 列是某种varcharRTRIM 就没有理由不工作。

    你能澄清一下表中symbol 列的数据类型吗?

    【讨论】:

    • 感谢您的回复。我运行了你的代码,这是一个好的开始,但是 csv 字符串在几十个值之后停止了(我期待超过 800 个)。目前我的符号列类型为 nchar(10)。
    • 我们已经接近了...但是在尝试多次调整并将输出发送到文件和文本之后,它始终在 58 个符号处中断。
    【解决方案3】:

    由于您使用的是 SQL Server 2008,因此您可以这样做:

    SELECT  STUFF((SELECT ', ' + rtrim(p.Symbol)
              from tblDailyPricingAndVol p FOR XML PATH('')),1,2,'') as Symbol
    WHERE    p.Volume > 1000000 
    AND      p.Clse <= 40 
    AND      p.TradeDate = @maxDate
    ORDER BY p.Symbol
    

    【讨论】:

    • 感谢您的回复,不过我不太明白这是什么意思,也无法运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    相关资源
    最近更新 更多