【问题标题】:In clause giving error while passing string values to integer column在将字符串值传递给整数列时出现错误的子句
【发布时间】:2013-06-20 23:59:53
【问题描述】:

我有如下查询

select * from table1 where id in (select ids from table2 where id = 100)

如果我单独运行,子查询会返回 34,35,55,66 等输出。

但是我上面的查询给出了错误

Conversion failed when converting the varchar value '34,35,55,56' to data type int.

table1 中的 id 列是 int。我知道我可以在 2 个单独的查询中执行此操作,但如果有任何方法可以在单个查询中执行,请告诉我。 非常感谢提前

【问题讨论】:

  • 请不要在一列中存储多个值。就像你的情况一样,这是一个真正的痛苦。你真的应该改变你的数据库结构。
  • @juergend 不,我不能更改为现有数据库。
  • 即使是现有的数据库也可以更改...即使您必须更改一些内容,也请考虑这样做。
  • 恰好包含一组数字和逗号的单个字符串与多个整数之间存在逻辑差异。这在 SQL 中和在我能想到的几乎任何其他语言中一样正确。更改结构确实会更好,因为您将继续使用当前设计解决痛点。如果您坚持要继续,则需要查找逗号分隔字符串 - 此处已被询问和回答 很多 次。
  • @Damien_The_Unbeliever 你能给我链接,我们可以用逗号分割字符串

标签: sql sql-server-2012


【解决方案1】:

尽管我不知道 sql server 和 cmets 关于这种结构是不可取的,但您可以在 mysql 中按照this fiddle 执行以下操作。

select distinct id from table1 join table2 on find_in_set(id,ids)

更新:我刚刚意识到这并不反映 table2 拥有自己的 id 字段并基于此限制搜索。如果您在修改查询以适应时需要帮助,请告诉我,我会更新它和小提琴。

更新 2:根据fiddle,这是一个蹩脚但可能有效的尝试在 SQL Server 中使用其更有限的字符串工具来执行此操作。如果有人知道 SQL Server 的更简单的 find_in_set 等效项,我很想知道它是什么。

select distinct id from table1 join table2 
  on patindex('%,'+cast(id as varchar)+',%',ids)>0 or
  patindex(cast(id as varchar)+',%',ids)>0 or
  patindex('%,'+cast(id as varchar),ids)>0 or
  patindex(cast(id as varchar),ids)>0

【讨论】:

  • 看来你可以用msdn.microsoft.com/en-us/library/ms188395.aspx代替find_in_set
  • 你可以把这个转换成sql吗?
  • 我为您的努力 +1。但是现在就离开它,因为我认为单个查询不可能。我放弃了:(
  • @AshReva:根据我包含的小提琴链接,我在 16 小时前对我的答案所做的更新在 SQL Server 中有效。您是否在寻找其他版本的 SQL?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多