我有两个表:MyOrders和MyDrivers。
在表MyOrders中,我有一列称为Details(数据类型TEXT-我知道,但是我没有建立数据库...)
在MyOrders.Details中,有时会有逗号分隔的数值列表,这些列表与表MyDrivers的ID值相对应。
目标是使用这些列表将MyOrders加入MyDrivers。
例如:
CREATE TABLE MyOrders
(
MyOrderID INT IDENTITY,
Details TEXT -- Wish it were NVarchar, but what can I do...
)
GO
CREATE TABLE MyDrivers
(
MyDriverID INT IDENTITY,
DriverName NVARCHAR(50)
)
GO
INSERT INTO MyOrders (Details) VALUES ('1,3,5,7,9')
INSERT INTO MyOrders (Details) VALUES ('2,4,6,8')
INSERT INTO MyOrders (Details) VALUES ('1,2,3,4')
INSERT INTO MyOrders (Details) VALUES ('4,5,6,7,8')
INSERT INTO MyOrders (Details) VALUES (NULL)
INSERT INTO MyOrders (Details) VALUES ('')
INSERT INTO MyOrders (Details) VALUES ('9')
INSERT INTO MyDrivers (DriverName) VALUES ('Alex')
INSERT INTO MyDrivers (DriverName) VALUES ('Bobby')
INSERT INTO MyDrivers (DriverName) VALUES ('Carl')
INSERT INTO MyDrivers (DriverName) VALUES ('Daryl')
INSERT INTO MyDrivers (DriverName) VALUES ('Ed')
INSERT INTO MyDrivers (DriverName) VALUES ('Frank')
INSERT INTO MyDrivers (DriverName) VALUES ('George')
INSERT INTO MyDrivers (DriverName) VALUES ('Hal')
INSERT INTO MyDrivers (DriverName) VALUES ('Ichabod')
INSERT INTO MyDrivers (DriverName) VALUES ('Justin Timberlake')
SELECT * FROM MyOrders O
INNER JOIN MyDrivers D
ON D.MyDriverID = ...? substring()? patindex()?
WHERE O.MyOrderID = 1
理想的结果是,对于MyOrderID 1,我将收到5行结果:在同一订单的“详细信息”列表中,分配给该订单的五个驱动程序中的每个驱动程序之一。如果没有列表(NULL,“,”,“”),那么我不希望返回任何行。**有时用户会删除此字段中的值,并在后面留空格,因此我假设我必须使用TRIM。但是它们总是会添加必要的逗号,因此至少存在...
我不知道该怎么办。我仍然有很多要学习的SQL。任何有用的提示/想法将不胜感激。
提前非常感谢您!
您可以这样使用 IN
:
SELECT *
FROM MyOrders O
INNER JOIN MyDrivers D
ON ',' + CAST(D.MyDriverID as varchar) +',' IN(','+ ISNULL(O.Details, '') +',')
WHERE O.MyOrderID = 1
更新
实际上,您不能使用IN
,但是可以使用LIKE
。原因是IN
期望值列表而不是用逗号分隔的单个字符串值。
SELECT MyOrderID, MyDriverID, DriverName
FROM MyOrders O
INNER JOIN MyDrivers D
ON ','+ cast(ISNULL(O.Details, '') as varchar(max)) +',' LIKE
'%,' + CAST(D.MyDriverID as varchar) +',%'
WHERE O.MyOrderID = 1
使用wewesthemenace在他的答案中提供的小提琴,我测试了他的建议解决方案(分割字符串)与我的建议解决方案(例如)的性能。对于您的样本数据,使用like似乎更快(不到一半的时间)(如果数据不同,则结果可能会不同)。您可以在此链接中自行检查。
如果可能的话,我强烈建议更改数据库结构并创建另一个表来保存“详细信息”列中当前存储的值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句