有 GUID 列表时如何从表中选择行? [复制]

Posted

技术标签:

【中文标题】有 GUID 列表时如何从表中选择行? [复制]【英文标题】:How to select rows from a table when having a list of GUIDs? [duplicate] 【发布时间】:2014-12-18 09:20:10 【问题描述】:

我想创建一个 SELECT,其中我有多个与 IN 运算符一起使用的 GUID。 为什么此查询不返回 Table1UID 等于 @table1IDs 中每个项目的所有行?

DECLARE @table1IDs NVARCHAR(100)
SET @table1IDs  = 'b15f554f-90ad-4fab-b3ac-a27bc68f3b21, 72213eb7-1041-408c-9ea1-35a667285c9b'

SELECT * FROM table1
WHERE Table1UID in (@table1IDs)

它只返回 ID 为 'b15f554f-90ad-4fab-b3ac-a27bc68f3b21' 的行。

说明:Table1UID 的类型是 UNIQUEIDENTIFIER

【问题讨论】:

GUID 的字符串列表很奇怪 - 看起来设计错误。为什么不是简单的 ID-s (int)? 这个查询我只想要用于调试目的。我们使用 GUID 作为主键。 【参考方案1】:

我猜你存储值的方式是错误的,如下所示

declare @temp table(ID nvarchar(1000))
insert into @temp values('b15f554f-90ad-4fab-b3ac-a27bc68f3b21')
insert into @temp values('72213eb7-1041-408c-9ea1-35a667285c9b')

SELECT * FROM table1
WHERE Table1UID in (select ID from @temp)

【讨论】:

谢谢。我选择了您的解决方案,因为您是第一个。 Reza ArabQaeni 的解决方案几乎相同。【参考方案2】:
DECLARE @QRY NVARCHAR(MAX)

SET @QRY = 'SELECT * FROM table1 WHERE Table1UID IN (' + @table1IDs + ')'

EXEC SP_EXECUTESQL @QRY 

更新

如果您选择动态值,请使用下面的代码,这样就可以了

SELECT @table1IDs = COALESCE (@table1IDs + ',[' + YOURCOLUMN + ']', 
              '[' + YOURCOLUMN + ']')
               FROM    (SELECT DISTINCT YOURCOLUMN FROM YOURTABLE) PV  
               ORDER BY YOURCOLUMN 

【讨论】:

这个解决方案更有用。 @alexa 为 GUID 列表使用变量 谢谢。您的解决方案有效,但是当我尝试添加另一个条件时,我有另一个 GUID 列,它返回给我转换问题。然而,它作为独立的工作,虽然难以维护。谢谢。 如果您的值是动态的并且您从列中选择值,您可以使用更新后的代码@Alexa Adrian【参考方案3】:
DECLARE @table1IDs table(id uniqueidentifier)
insert into @table1IDs(id) values 
('b15f554f-90ad-4fab-b3ac-a27bc68f3b21')
,('72213eb7-1041-408c-9ea1-35a667285c9b')

select * from table1 where Table1UID in (select id from @table1IDs)

【讨论】:

【参考方案4】:

Split 将字符串分成行并在where 子句中使用

DECLARE @table1IDs NVARCHAR(100)
SET @table1IDs  = 'b15f554f-90ad-4fab-b3ac-a27bc68f3b21, 72213eb7-1041-408c-9ea1-35a667285c9b'


SELECT *
FROM   table1
WHERE  Table1UID IN(SELECT Rtrim(Ltrim(Split.a.value('.', 'VARCHAR(100)')))
                          FROM   (SELECT Cast ('<M>' + Replace(@table1IDs, ',', '</M><M>') + '</M>' AS XML) AS Data) AS A
                                 CROSS APPLY Data.nodes ('/M') AS Split(a)) 

【讨论】:

以上是关于有 GUID 列表时如何从表中选择行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何从表中提取行,用不同的值过滤同一列?

如何通过 Jquery 从表中查找按列指定的行的索引和值?

在试听中如何用SQL选中从表选取所有列

从表中选择不同的记录并执行重复行的列总和(托盘、总和)。并显示重复的行一次[关闭]

从表中选择前 N 行

为啥 dapper 在进行选择时为 Guid 返回全零但表中的 guid 值设置正确?