【问题标题】:How do I get rid of .. Replace(Replace(Replace(Replace(Replace( …?如何摆脱 .. Replace(Replace(Replace(Replace(Replace( ...?
【发布时间】:2008-12-03 23:15:04
【问题描述】:

我正在选择具有滥用状态列的旧数据库中的数据。状态列中包含多条信息。值如“新联系人 YYYY”、“在线 YYYY”、“更新 YYYY”、“撤回 YYYY”等……。您可能已经猜到了,YYYY 代表我需要的年份。

过去我做过类似的事情

Rtrim( ltrim( Replace(Replace(Replace(Replace(Replace( …

基本上,用空字符串替换所有文本值,所以唯一仍然存在的是年份。我仍然可以这样做,但我认为这很荒谬,必须有更好的方法。

有人知道更好的方法吗?

【问题讨论】:

    标签: sql-server sql-server-2005


    【解决方案1】:

    如果你只是想从字符串中提取一个四位数的年份,你可以使用 PATINDEX

    SELECT SUBSTRING(FieldName, PATINDEX('%[0-9][0-9][0-9][0-9]%', FieldName), 4)
    FROM TableName
    

    【讨论】:

    • 不错! PATINDEX 对我来说是新的,另一天学习新东西! ;)
    • 当我看到用于过滤记录的函数时,我不寒而栗,因为它们效率太低了。如果您想单独使用该模式,则应将其修改为单独存储年份。这种事情对于小型数据库来说是可以的,但我们在真正巨大的大型机数据库上工作,这将成为嘲笑的理由。
    【解决方案2】:

    如果年份总是最后 4 年:

    SELECT right(FieldName,4) from table
    

    【讨论】:

    • 幸运的是 Tim C 有一个更好的解决方案。 ;)
    【解决方案3】:

    所有给出的答案都解决了您的问题,但正确的答案是更好地规范您的数据库。如果您需要将年份作为单独的项目,则应将其存储在单独的列中。

    其他任何事情都只是去除疣上的毛发,就像我亲爱的老奶奶过去常说的那样(她从未真正说过,我只是想到它,听起来有点酷 - 一定是我很少出去的原因:-)。

    【讨论】:

    • 没错,但商务人士一直都在做这种事情。他们没有打电话给你,而是把它塞在某个地方。这是一个非常温和的问题,我所在的另一个客户,当我加入他们时,这是文化的一部分……只是在任何地方塞东西。我想我终于说服他们停下来了。
    • 幸运的是,对于大型机,客户端会因效率低下(保持 JDBC 连接时间过长或使用过多 CPU 时间进行查询)而收费。像任何坏狗一样,它们偶尔需要用报纸敲打鼻子。
    猜你喜欢
    • 2021-06-07
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2019-02-19
    • 2018-04-13
    • 1970-01-01
    • 2011-06-27
    相关资源
    最近更新 更多