【问题标题】:SQL Server where using multiple data types使用多种数据类型的 SQL Server
【发布时间】:2017-05-04 17:11:59
【问题描述】:

我想不出更好的标题。

我有一个值列表,例如:

List<string> ids = new List<string>() {"1", "AND", "2", "NOT", "3"}

还有一个数据库表,其中包含上面列表中指定的 id。 我的问题是我需要根据 id 检索数据,包括在表中找不到的值(上面列表中的运算符 ANDNOT)。 例如,使用上面的列表,在读取 123 的 db 值后,将创建一个新列表,如下所示:

List<string> values = {"Value1", "AND", "Value2", "NOT", "Value3"}

运算符ANDORNOT)( 只是在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') 

我想从数据库接收Value1Value2AND。我知道执行查询时不保证顺序。

我怎样才能有效地解决这个问题?我使用 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)。如果Idint - 不要传递非整数值,因为它不可能匹配。所以:更早地排除"AND"

标签: c# sql-server


【解决方案1】:

首先,您需要从列表中提取那些需要转换的列表条目,即您的搜索键。

完成后,您可以像这样查询:

select id, title from MyTable where id in ( /* list goes here*/)

将查询结果加载到Dictionary&lt;int,string&gt;

然后,再次检查列表,将键替换为字典中的值。

如果您发现 SQL 查询执行不佳,您应该查看索引和查询提示,或者再次要求更快的查询。

为什么这可能会提高性能

主要原因是它会减少访问数据库的次数。但是,如果数据库在同一台物理机器上,这不太可能很重要。

或者,如果键和标题列表不经常更改,并且稍微过时也没关系,您可以将整个内容加载到字典中。 100,000 个条目并不多 - 如果每个条目是 50 个字节,那么只有 5 MB,这在现代服务器上并不是很多。

【讨论】:

    【解决方案2】:

    您可以尝试在您的 SQL 查询中转换 Id

    SELECT Title
    FROM MyTable where cast(Id as nvarchar) in (1,2,'AND')
    

    但这会大大降低你的表现

    【讨论】:

    • 如果Idint,那么在性能方面这是一个糟糕的想法
    • @MarcGravell 将您的注释添加到答案中
    • 通过使用这个我没有得到预期的结果,AND 没有被查询返回。请注意AND 不在表格中。
    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多