【发布时间】:2017-05-04 17:11:59
【问题描述】:
我想不出更好的标题。
我有一个值列表,例如:
List<string> ids = new List<string>() {"1", "AND", "2", "NOT", "3"}
还有一个数据库表,其中包含上面列表中指定的 id。
我的问题是我需要根据 id 检索数据,包括在表中找不到的值(上面列表中的运算符 AND 和 NOT)。
例如,使用上面的列表,在读取 1、2 和 3 的 db 值后,将创建一个新列表,如下所示:
List<string> values = {"Value1", "AND", "Value2", "NOT", "Value3"}
运算符AND、OR、NOT、) 和( 只是在MyTable 中找不到的简单字符串。
到目前为止,我一直在拆分 id,并且对于每个值,我都会访问 db 并获取值。这样做的问题是,即使是 2k 列表也需要很多时间。一个列表每个大约有 10 个值。
我在想的是使用where in 子句,它有望减少访问数据库的次数。不幸的是,我不知道如何处理第一个列表中的运算符。 (运算符不保存在MyTable中)。
我尝试使用多个 where 条件,但无法将运算符(字符串)转换为 int(Id 列的类型)。
我尝试过的查询:
SELECT Title
FROM MyTable where Id =1 or Id = cast('AND' as int)
和
SELECT Title
FROM MyTable where Id in (1,2,'AND')
它们都失败了(正确地),因为 sql 无法将 AND 转换为数据类型 int。
我想要的是对第一个列表使用where 子句(或任何其他子句),并且在数据库中没有找到结果的地方返回查询中使用的值。
例如,对于查询:
SELECT Title
FROM MyTable where Id in (1,2,'AND')
我想从数据库接收Value1、Value2、AND。我知道执行查询时不保证顺序。
我怎样才能有效地解决这个问题?我使用 c# 和 sql server 2012 没有任何 orm
【问题讨论】:
-
我不太明白你的意思。在您的列表中是
"AND"一个ID?还是打算成为布尔运算符? -
@Ben 编辑了问题,
AND只是稍后在应用程序中使用的字符串。这些运算符根本没有保存在数据库中。 -
如果这些“运算符”没有保存到数据库中,那么为什么您的查询会包含它们?
-
您实际上并没有告诉我们您要做什么。如果您需要有用的建议,您需要这样做。
-
Id是什么数据类型?如果是[n][var]char({max|len}),那么:只是不要将"1"和"2"等转换为整数——始终将它们视为字符串;理想情况下,参数化 - 所以Id in ('1','2','AND')或Id in (@p0,@p1,@p2)。如果Id是int- 不要传递非整数值,因为它不可能匹配。所以:更早地排除"AND"
标签: c# sql-server