【问题标题】:Remove specific characters from column data of select query从选择查询的列数据中删除特定字符
【发布时间】:2012-10-13 15:00:09
【问题描述】:

我一直在寻找解决问题的方法,尽管我找到了一些可能有所帮助的方法,但我不确定这是否是满足我需要的正确方法。请记住,我正在学习并且对 SQL 相当陌生。但我有两个表要使用内部联接查询。

两个表中都有一个名为CAVITY 的列,但它们以不同的格式保存值。一个表将值保存为 H02,另一个表将值保存为 2。

我想使用 H02 格式对该列进行内部连接,但不想更新将值保存为单个数字的表(用于数据输入目的)。因此,例如,如果一个表列有 H02 而另一个有 2,我希望它被加入。如果一个表有 H13 和另一个 13,我希望它也是一个连接。所以基本上,我想删除 H 和 0(但前提是有一个 0 直接跟在 H 之后)。除非有办法做相反的事情并从另一个表的结果中添加 H / H0。

example data
table1.cavity   table2.cavity
     H01      =    1
     H02      =    2
     H10      =    10
     H12      =    12

我的查询结果是不是H0版本对我来说并不重要;我只需要加入工作;我最终可以适应任何一种结果。

我使用的是 SQL Server 2005

我有剩下的查询,它工作正常;我只需要添加这个额外的连接。请帮忙!任何帮助是极大的赞赏。谢谢

【问题讨论】:

  • table2.cavity,类型为INT
  • 请详细了解您尝试用于加入的数据类型。

标签: sql sql-server-2005 join trim


【解决方案1】:

REPLACE(REPLACE(cavity,'H0',''),'H','')

第一个去掉H0:

REPLACE(cavity,'H0','')

然后第二个替换任何剩余的 H:

REPLACE(output_of_previous,'H','')

【讨论】:

  • 谢谢!抱歉,我花了这么长时间才发表评论。
【解决方案2】:

您可以这样做的一种方法如下:

 from table1 join
      table2
      on cast(substring(table1.cavity, 2, 100) as int) = table2.cavity

(这是假设2 表示table2.cavity 存储为整数。

不过,请务必小心。您需要注意查询计划。在编写这样的查询时,很容易得到一个使用嵌套循环连接的计划。如果你的桌子很小,这没什么大不了的。但是,即使是中等大小的表也可能会产生非常低效的查询计划。

【讨论】:

    【解决方案3】:
    CREATE FUNCTION [dbo].[RemoveAlphaCharacters](@Temp VarChar( 1000))
    RETURNS int
    AS
    BEGIN
      WHILE PatIndex ('%[^0-9]%', @Temp) > 0
      SET @Temp = Stuff(@Temp, PatIndex('%[^0-9]%', @Temp), 1, '')
      RETURN @Temp
    END
    

    可以在这样的join子句中使用

    SELECT a.col1 a, b.col1 b
    FROM tablea a JOIN tableb b ON dbo.RemoveAlphaCharacters(a.col1) = b.col1
    

    【讨论】:

      猜你喜欢
      • 2022-12-17
      • 2013-09-08
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多