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

时间:2015-07-20 14:04:55

标签: sql-server string comparison concatenation

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

表A

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

在表B中,列Frequency(数据类型:numeric)的值为4.0000,154.00000,100.00000,4.00000及其对应的句点代码Period_Code(数据类型:{{1同一个表TableB中的列,如M,W,D和Y。

表B

Varchar

我可以在Frequency | Period_Code ------------------------------- 4.0000 | M 154.00000 | W 100.00000 | D 4.00000 | Y 上加入两个表格。

我想比较表B中记录的order_idFrequency的组合是否存在于TableA的Period_Code列中。

我该怎么做?

它是SQL Server 2008或更高版本。

请帮忙。

感谢。

4 个答案:

答案 0 :(得分:0)

一个问题......你如何将4.0000作为INT?

所以你有这样的事情:

Dim newRow As DataRow = yourdatatable.NewRow()
With newRow
    .SetField(Of Int32)("ORDER_DET_ID", Int32.Parse(Me.TextBoxOrderDetID.Text))
    .SetField(Of String)("ORDER_DET_ITEM", Me.TextBoxOrderDetItem.Text)
    ' etc.
End If
yourdatatable.Rows.Addf(newRow)

答案 1 :(得分:0)

以下代码与所需的输出匹配:

    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

答案 2 :(得分:0)

如果要连接tableB中的两个字段,可以使用CONCAT函数(SQL Server 2012+)或+(旧版本)。然后,要查找连接字段是否与tableA中的句点列匹配,您可以直接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来执行此操作:

NOT EXISTS方法

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
        );

NOT IN方法

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

答案 3 :(得分:0)

选择A.order_id,B.order_id,A.Period,B.Period_Code,B.Frequency

来自tableB B

在a.order_id = b.order_id

上左连接表A A.

其中cast(substring(A.period,1,(len(A.period)-1))AS数字(14,6))<>
      B.FREQUENCY或       上(右(A.period,1))<> B.Period_Code