【问题标题】:How to replace a string of ID-s with data connected to those ID-s in a SELECT如何将一串 ID-s 替换为 SELECT 中连接到这些 ID-s 的数据
【发布时间】:2019-04-29 13:54:56
【问题描述】:

我有 2 张桌子。第一个表有一个列“EmployeeIds”,它是一个字符串,其中包含一组用逗号分隔的 ID(例如:“4124,2945,2873,4047,3046,4774”)。

第二个表有一个这些ID-s作为他的标识(EmployeeID),还有与这些ID-s相关的名字。

我想要一个选择,其中列出了 table1 中的所有内容,但不是 EmployeeIds 列中的 ID,我想查看连接到这些 ID 的名称。

SELECT name from Table2
WHERE EmployeeID CAST(EmployeeID AS int) IN (SELECT EmployeeIds FROM Table1)

我收到了错误:“将 varchar 值 '4124,2945,2873,4047,3046,4774' 转换为数据类型 int 时转换失败。”

我知道上面的代码不会返回我需要的一切,因为我还需要将它与 Table1 一起加入,但我正在从内到外工作,我已经被困在这里了。

【问题讨论】:

  • 将一堆 Employid 存储在以逗号分隔的字符串中是个坏主意。您可以使用该字符串构建查询,但这不是一个好习惯。
  • 我知道(table2 id-s 甚至不是 int 形式也很糟糕),但我们有一个我们现在必须使用的数据库,我无法更改数据库,现在只使用一些 SELECT :(
  • 试试find_in_set
  • 什么是后端数据库?
  • 将逗号分隔的数据放入这样的列中是非常糟糕的架构设计。您确实需要一个额外的表,其中包含第一个表中的键字段和 只有一个 员工 ID 的字段。然后,您可以在新表中为每个 ID 分别记录,并使用简单的 JOIN 解决此问题。但我知道您可能无法通过弹指来修复(我说“修复”,因为当前架构确实损坏)现有系统。毕竟,我们并不都是灭霸。

标签: sql sql-server tsql


【解决方案1】:

如果您使用的是 SQL Server 2016,您可以这样做:

DECLARE @s varchar(1000)
SELECT @s=EmployeeIds FROM Table1
SELECT name from Table2
JOIN STRING_SPLIT(@s,',') ON value=CAST(EmployeeID AS int)

【讨论】:

    猜你喜欢
    • 2013-04-30
    • 1970-01-01
    • 2016-08-20
    • 2022-08-03
    • 1970-01-01
    • 2014-10-06
    • 2014-03-13
    • 1970-01-01
    • 2019-09-01
    相关资源
    最近更新 更多