sql-server - 如何从字符串 id 中选择 id 所在的数据?

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

我有两个表,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')

你能告诉我这里有什么问题并给我解决方案吗?谢谢。

最佳答案

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

关于sql-server - 如何从字符串 id 中选择 id 所在的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40374381/

相关文章:

sql - Json_value 和 Json_query 找不到指定的路径

sql-server - SQL Server 2005 - 授予创建存储过程的权限(但不授予其他对象)

sql - T-SQL- Sum over Partition by 结合 group by

c++ - 从 SQL Server 在 C++ native 客户端中返回 NULL 数据类型

sql - 动态 SQL Server 数据透视表

asp.net - Azure 网站和 Azure 云服务之间的区别

c# - Linq to Sql isnull in where 子句不起作用

sql - 从数据库中过滤唯一记录,同时删除双非空值

SQL Server : copy a table into another table in reverse order

sql-server - 如何获取表存储信息