【问题标题】:select from table where @variable in(table column)从表中选择@variable in(表列)
【发布时间】:2016-01-25 23:40:18
【问题描述】:

您能否更正这个 sqlserver 查询:

select * from messages where @DepartID In(MsgTo)

@DepartID 是一个包含部门 ID 的会话变量。 MsgTo 是消息表中的一列,其中包含值列表,例如。 : '12','10','13','25' ..等等

我使用了这个代码:

cmd.CommandText = "select * from messages where @DepartID IN(MsgTo)"
cmd.Parameters.AddWithValue("@DepartID ", session("DepartID")) ' = 12 for example

Dim da As New SqlDataAdapter(cmd)
Dim dt As New DataTable
da.Fill(dt)
lbmsg.text = dt.Rows.Count.ToString ' returns 0 rows

对不起我的英语不好

【问题讨论】:

  • 这是一个乐观编码的例子。您希望 SQL Server 会碰巧注意到您的表中的一列看起来可能包含一个值列表,并使用其令人难以置信的 Insight Engine 解码该列表并直觉您的意图。不会发生。您需要获取信息高速公路上可用的常用函数之一,该函数将逗号分隔的列表分隔为值表,将字符串转换为整数,然后在查询中使用它。
  • 你是对的@HABO,我认为他们应该围绕它工作。我同意功能,我认为这是唯一的方法... thx

标签: sql asp.net sql-server-2008 tsql


【解决方案1】:

我认为您只是遇到了一些语法问题。您是否在 SQL 中声明了 @DepartID 变量?您需要与 WHERE 子句中的现有列进行比较。喜欢:

SELECT [ColumnName]
FROM [Table]
WHERE [ColumnName] = Value

如果您的部门 ID 是 SQL 中的文本类型列,则您必须在输入中使用单引号。当您使用“IN”语句查询它们时,您可以在像 ID 这样的整数中使用单引号,并且无论如何它都会起作用。试试这个:

SELECT *
FROM [messages]
WHERE [MsgTo] = @DepartID

因此,如果您将 @DepartID 变量替换为您的值,然后执行该语句,它将返回 [MsgTo] 列等于您的 @DepartID 的每一行的所有信息。

如果您要传递多个@DepartID,则必须将逗号分隔的文本列表传递给带有变量的“IN”子句,如下例所示:

SELECT *
FROM [messages]
WHERE [MsgTo] IN ('1','5','3','12','30')

--Example where @DepartID = '1','5','3','12','30'

我不确定您使用什么语言来执行 SQL,但如果这不起作用,请尝试将您的 SQL 语句封装在 EXEC() 中,如下所示:

EXEC(
    SELECT *
    FROM [messages]
    WHERE [MsgTo] = @DepartID
)

如果您的 MsgTo 列包含值的字符串列表,并且您想在其中搜索单个 @DepartID,则使用以下代码:

DECLARE @DepartID as INT; SET @DepartID = 12; --Hard coded example

SELECT *
FROM [messages]
WHERE [MsgTo] LIKE ('%,'''+@DepartID+''',%')

【讨论】:

  • thx EMUEVIL .. 实际上我想要检查 MsgTo 列中的离开 ID 是否作为值列表,例如:如果我向多个部门发送消息并将部门 ID 存储在 MsgTo 列中: '12','13','15,'20' 等。然后我想获取发送到部门 12 的所有消息。使用 like 子句将返回 12 和 122 和 121 等。
  • @Eid 试试我的最后一个例子。它将选择发送到指定的离开ID的所有行:DECLARE @DepartID AS INT; SET @DepartID = 12; SELECT * FROM [messages] WHERE [MsgTo] LIKE ('%,''+@DepartID+'',%')
  • 在这种情况下使用 Like 子句不是一个好方法,它可能会返回类似 12 的值。例如:112,1112,1211,1232 等,试试吧
  • 如果您将逗号分隔符作为正则表达式的一部分,它不应该提取错误的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
相关资源
最近更新 更多