我有两个表,TABLE1 有两列(EID 和 NAME),TABLE2 有两列(CID 和 E_LIST)。现在,我想从 TABLE2 的 E_LIST 中使用 EID 从 TABLE1 中选择数据,但似乎它不起作用。
EID NAME
E01 GREEN
E02 BROWN
E03 BLACK
E04 APPLE
E05 FOOD
E06 FISH
CID E_LIST
C01 E02,E05,E06
C02 E01,E02,E03
SELECT * FROM TABLE1 WHERE EID IN (SELECT E_LIST FROM TABLE2 WHERE CID ='C01')
你能告诉我这里有什么问题并给我解决方案吗?谢谢。
最佳答案
停止在单列中存储逗号分隔值。每个 CID
和 E_LIST
组合都有单独的行。数据检索会容易得多
现在回到问题上来,你需要一个拆分字符串的函数来做到这一点
SELECT *
FROM TABLE1
WHERE EID IN (SELECT cs.split_items
FROM TABLE2 t2
CROSS apply Udf_splitstring(t2.E_LIST, ',') cs
WHERE t2.CID = 'C01')
从这里创建一个 Split strings the right way – or the next best way .
我更喜欢理货表方式
CREATE FUNCTION dbo.Udf_splitstring
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING AS
RETURN
WITH cteTally(N) AS
(
SELECT TOP (DATALENGTH(ISNULL(@List,1))+1) Number-1
FROM dbo.Numbers ORDER BY Number
),
cteStart(N1) AS
(
SELECT t.N+1
FROM cteTally t
WHERE (SUBSTRING(@List,t.N,1) = @Delimiter OR t.N = 0)
)
SELECT split_items = SUBSTRING(@List, s.N1,
ISNULL(NULLIF(CHARINDEX(@Delimiter, @List, s.N1), 0) - s.N1, 8000))
FROM cteStart AS s;
关于sql-server - 如何从字符串 id 中选择 id 所在的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40374381/