从选择查询的列数据中删除特定字符

时间:2012-10-23 15:54:54

标签: sql sql-server-2005 join trim

我已经搜索并搜索了我的问题的解决方案,即使我找到了一些可能有帮助的解决方案,但我不确定这是否是我需要的正确方法。请记住,我正在学习并且对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

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

3 个答案:

答案 0 :(得分:4)

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

第一个删除H0:

REPLACE(cavity,'H0','')

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

REPLACE(output_of_previous,'H','')

答案 1 :(得分:0)

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

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

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

但是要小心谨慎。您需要注意查询计划。在编写此类查询时,使用嵌套循环连接最终得到计划非常容易。如果你的桌子很小,这不是什么大问题。但是,即使是中等大小的表也会产生效率极低的查询计划。

答案 2 :(得分:0)

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

可以在像这样的连接子句中使用

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