在 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 中记录的 Frequency
和 Period_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
);
反之,如果你想输出匹配失败的所有order_ids',你可以使用NOT EXISTS
或NOT 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
);
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
我在 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 中记录的 Frequency
和 Period_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
);
反之,如果你想输出匹配失败的所有order_ids',你可以使用NOT EXISTS
或NOT 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
);
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