【问题标题】:Executing SQL query with multiple values使用多个值执行 SQL 查询
【发布时间】:2019-12-08 14:58:33
【问题描述】:

我怀疑我需要的答案已经在某个地方的堆栈溢出,但我不确定我需要的函数是什么,因此不太知道要搜索什么......我认为这将是一个排序数组还是模数?

让我解释一下,作为一个相对初学者,请温柔一点。我当前的查询内容为:

SELECT c.C_Name, c.C_ID, q.Quote_Type from case c  inner join Quotes q
on q.Case_ID = c.ID where q.Quote_Type = 'Every 10 Years' and c.created_Date
like '" & ((ComboBox_Year.Text - 10) & monthNumber) & "%'

我的表单的用户从组合框中选择了月份和年份,查询返回 10 年前的数据。

我的问题:有没有一种方法可以返回 20、30 和 40 年前的数据,而无需为每个数据写一个新的“或”行?

【问题讨论】:

  • 您想在一次查询中选择 20、30 和 40 年的数据吗?
  • 如果他们选择 20 等,查询将立即执行此操作,假设 monthNumber 相应更改
  • 理想情况下。我不仅有一个 10 年的查询,我还想扩展它以增加 5、7、8 年的倍数的行。如果我对每一个都有一个查询,就会有 16 行“或”行!我认为一定有更好的方法...?
  • @MattDouhan - 抱歉,马特,应该澄清一下,'monthNumber' 是从一月、二月、三月等的组合框选择到 01、02、03 等的转换。
  • @trickyb_uk 你可以使用 IN 子句并发送一个逗号分隔的字符串,就像这样 select x from foo where date IN (10,20,30) ..... 这样你的 IN 子句可以是你想要的任何东西,但仍然只有一个查询

标签: sql .net


【解决方案1】:

也许可以使用 datepart 和 datediff 的组合。看看这是否有帮助,可能不是你所追求的,但希望能帮助你到达那里。

SELECT 
  c.C_Name
  ,c.C_ID
  ,q.Quote_Type 
FROM Case c  
INNER JOIN Quotes q
ON q.Case_ID = c.ID 
WHERE q.Quote_Type = 'Every 10 Years' 
AND DATEPART(m, c.created_Date) = monthNumber
AND DATEDIFF(y, c.created_Date, CAST(CAST(ComboBox_Year.Text AS varchar) + '-' + CAST(monthNumber AS varchar) + '-01')  AS DATETIME) IN (10,20,30,40)

这实际上是从组合框的月份数和文本中创建一个日期时间值(假设是所选年份),然后在创建的日期之间获取差异,确保年份差异在 10、20、30 中等。同时确保 created_Date 月份数与所选内容相匹配。一个查询没有任何类型的“或”语句,只有一个“in”语句。

希望这会有所帮助!

【讨论】:

  • 这看起来像是我可以开发的东西。根据前面的建议,我一直在努力弄清楚如何将“LIKE”函数和“IN”函数结合起来——这两者似乎不兼容(在我有限的理解中)。
【解决方案2】:

感谢大家为此提供的帮助。我设法联系了数据库创建者——他提醒我“created_date”字段不是日期格式的,而是字符串(不要问我为什么),这意味着我可以使用 SUBSTRING 来分割年份和月份,执行计算,然后按照@MattDouhan 的建议使用 IN 函数。

作为开发,有人可以提供可以减少我的查询的方法

... IN('10', '20', '30', '40', '50', etc, etc)

to '...IN ('所有 10 的倍数)'

这样的事情存在吗?

【讨论】: