在 T-SQL 中连接时比较不同数据类型的列

Comparing columns of different datatypes while concatenating in T-SQL

我在 tableA 的列 Period 中有值(数据类型:Varchar),如下所示:

TABLE一个

Period
------
3M
124W
200D
2Y

在Table B 中,Frequency 列(数据类型:numeric)的值类似于4.0000、154.00000、100.00000、4.00000 及其在Period_Code 中的相应句点代码(数据类型:Varchar)与 M、W、D 和 Y 在同一 tableTableB 中的列。

TABLE B

Frequency      |    Period_Code
-------------------------------
4.0000         |          M
154.00000      |          W
100.00000      |          D
4.00000        |          Y

我可以在 order_id 上加入两个 table。

我想比较 TableB 中记录的 FrequencyPeriod_Code 的组合是否存在于 Period 列中 Table一个。

我该怎么做?

为SQLServer 2008或更新版本。

请帮忙。

谢谢。

一个问题...你怎么有 4.0000 作为 INT?

所以你有这样的东西:

    select * from tableB 
     where substring(convert(varchar,Frequency),0,charindex('.',Frequency))+Period_Code  
         in (
             Select Period
             from tableA
             )

下面的代码匹配所需的输出:

    DECLARE @tableA TABLE
    (
        [Period] VARCHAR(50)
    )

    DECLARE  @tableB TABLE
    (
        [Frequency] INT
    ,   [Period_Code]   VARCHAR(50)
    )

    INSERT INTO @tableA
    VALUES('3M'), ('124W'), ('200D') , ('2Y')

    INSERT INTO @tableB(Frequency, Period_Code)
    VALUES(4, 'M')
    , (154, 'W')
    ,   (100, 'D')
    , (4, 'Y')

    SELECT * FROM @tableA
    SELECT * FROM @tableB

    SELECT * FROM @tableA a
    INNER JOIN
    @tableB b
    ON a.Period = CONVERT(VARCHAR, b.Frequency) + b.Period_Code

如果您想连接表 B 中的两个字段,您可以使用 CONCAT 函数(SQL Server 2012+)或仅使用 +(旧版本)。然后,要查找串联字段是否匹配回表 A 中的期间列,您可以直接执行 join 或使用 IN 或仅使用 EXISTS 来完成所需的输出:

加入方法

SELECT distinct b.*
FROM tableA a
INNER JOIN (
    SELECT order_id,
           frequency,
           period_code,
           convert(VARCHAR(255), cast(frequency as int)) + period_code AS period
    FROM tableB
    ) b ON a.order_id = b.order_id and a.period = b.period;

EXISTS 方法

SELECT distinct b.*
FROM tableB b
WHERE EXISTS (
        SELECT 1
        FROM tableA a
        WHERE a.order_id = b.order_id 
        AND a.period = convert(VARCHAR(255), cast(frequency as int)) + b.period_code
        );

IN 方法

SELECT DISTINCT b.*
FROM tableB b
WHERE convert(VARCHAR(255), cast(frequency as int)) + period_code IN (
        SELECT period
        FROM tableA a
        WHERE a.order_id = b.order_id
        );

SQL Fiddle Demo

反之,如果你想输出匹配失败的所有order_ids',你可以使用NOT EXISTSNOT IN来实现:

不存在方法

SELECT distinct b.order_id
FROM tableB b
WHERE NOT EXISTS (
        SELECT 1
        FROM tableA a
        WHERE a.order_id = b.order_id 
        AND a.period = convert(VARCHAR(255), b.frequency) + b.period_code
        );

不在方法中

SELECT distinct b.order_id
FROM tableB b
WHERE convert(VARCHAR(255), frequency) + period_code NOT IN (
        SELECT period
        FROM tableA a
        WHERE a.order_id = b.order_id
        );

SQL Fiddle Demo2

select A.order_id, B.order_id, A.Period, B.Period_Code, B.Frequency

来自表B B

left join tableA A on a.order_id = b.order_id

where cast(substring (A.period,1,(len(A.period)-1)) AS numeric(14,6)) <>
B.FREQUENCY 或 上(右(A.period,1)) <> B.Period_Code