【问题标题】:How to compare two columns in SQL server如何比较 SQL Server 中的两列
【发布时间】:2014-04-20 15:24:49
【问题描述】:

我在 SQL Server 中的两个不同表中有两列。一列有9.011,其他表列有9011。我需要删除. 并比较这两列以查看它们是否相等。

谁能帮我看看怎么做?

提前致谢。

【问题讨论】:

  • 你检查了吗http://stackoverflow.com/questions/1632792/how-do-i-compare-two-columns-for-equality-in-sql-server
  • SQL Server 还是 MySQL?语法可能会有所不同。

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

我假设你的列是十进制类型,所以我先将它们转换为 varchar

where 
replace(Convert(varchar(50), column1 ),'.','') = Convert(varchar(50), column2)

【讨论】:

  • float & int, decimal(4,3) & decimal(4,0), numeric(4,3) & numeric(4,0) (给出有问题的数字) 等等都应该可以用这种方法 - 只要他们的比例和精度当然会捕获要比较的数字作为字符串。
【解决方案2】:

试试这个:

SELECT CASE WHEN REPLACE (Table1.ColName1,'.','') = Table2.ColName2 
            THEN 'Equal' 
            ELSE 'Not Equal' 
            END AS IsEqual
    FROM Table1
    INNER JOIN Table2 ON Table1.PrimaryKey = Table2.ForeignKey

如果它们相等,此查询将返回 Equal,否则返回 Not Equal

REPLACE() 将从ColName1 中删除.

【讨论】:

  • 在这种情况下我还是更喜欢显式,但这是隐式转换的一个很好的用法。
【解决方案3】:

将数字转换为字符串、清除小数点和比较应该适用于具有比例和精度的数字类型,以捕获所有要比较的数字。

比如下面的T-SQL中的PoC...

DECLARE @foo float = 9.011;
DECLARE @bar int = 9011;
--Yup!
--DECLARE @foo decimal(4,3) = 9.011;
--DECLARE @bar decimal(4) = 9011;
----Yup!
--DECLARE @foo numeric(4,3) = 9.011;
--DECLARE @bar numeric(4) = 9011;
----Yup!
--...etcetera.

DECLARE @fooString varchar(max) = CAST(@foo AS varchar(max));
DECLARE @barString varchar(max) = CAST(@bar AS varchar(max));

PRINT '@fooString = ' + @fooString;
PRINT '@barString = ' + @barString;

IF (REPLACE(@fooString, '.', '') = @barString
    PRINT 'Yup!';
ELSE
    PRINT 'Nope....';

...产生以下输出:

@fooString = 9.011
@barString = 9011
Yup!

不,您当然不需要varchar(max):只需根据您的需要设置更合理的字符串长度即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 2010-12-10
    • 1970-01-01
    • 2021-06-13
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多