我有两个表:MyOrders和MyDrivers。
在表MyOrders中,我有一列称为详细信息(数据类型为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中his answer提供的小提琴,我测试了他的建议解决方案(分割字符串)与我的建议解决方案(例如)的性能。对于您的样本数据来说,使用like似乎更快(不到一半的时间)(如果数据不同,结果可能会不同)。您可以在this link中自行检查。
如果可能的话,我强烈建议更改数据库结构并创建另一个表来保存“详细信息”列中当前存储的值。