如何从字符串ID中选择id的数据?

时间:2016-11-02 07:21:06

标签: sql-server tsql sql-server-2008-r2

我有两个表,TABLE1有两列(EID和NAME),TABLE2有两列(CID和E_LIST)。现在,我想从TABLE1中选择数据,其中EID来自TABLE2的E_LIST,但似乎它不起作用。

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

你能告诉我这里的错误并给我解决方案。谢谢。

4 个答案:

答案 0 :(得分:2)

停止在单列中存储逗号分隔值。为每个CIDE_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;

答案 1 :(得分:1)

在链接中使用LoginActivity.java之类的内容。还有其他更好的功能。

NullPointerException

答案 2 :(得分:0)

查询将EID与EID列表进行比较。您可以通过连接而不是子查询来解决问题,并使用like假设一个EID不能是另一个EID的子字符串。

答案 3 :(得分:0)

使用左连接查询。这对你来说很容易