【问题标题】:SQL concat value as columnSQL concat 值作为列
【发布时间】:2019-08-22 13:52:16
【问题描述】:

我正在尝试将一个字符串转换为有效列。 如您所见,我需要得到类似'mo._olddb_uid_'+nu._olddb_name_db 的东西,它应该使用mo._olddb_uid_001

我怎样才能做到这一点:

SELECT *
  FROM [PI_CONSOLIDATION].[dbo].[new_unite] nu
  LEFT JOIN [PI_CONSOLIDATION].[dbo].[Motif_Orientation] mo ON CONCAT('mo._olddb_uid_',nu._olddb_name_db) = CONCAT(nu._olddb_name_db,'_',nu.id_motif_orientation)
   WHERE nu.nom_res = 'TEST' and nu.prenom_res = 'Foobar'

谢谢


编辑: 我有 18 个应用程序,每个应用程序都有他的数据库。这些应用程序几乎与不同的数据相似,但有时数据也可以在其他来源上找到。 所以[new_unite]有病人的id、id_group和源数据库

id_resident id_groupe_res   _olddb_name_db
728         31              src1
629         21              src6
731         25              src9
934         12              src18
...

另一个表有一些参数,它们具有相同的参数,但 ID 不同,具体取决于源的 DB。

所以[Motif_Orientation] 看起来像:

所以这个查询主要只是为了测试数据是否正确存储在只有一个数据库并且所有数据合并的最终应用程序中

id_motif_orientation    label
1407                    Famille
1410                    Structures d'hébergement
1422                    Etablissement d'Education Spéciale

【问题讨论】:

  • 样本数据和预期结果会有所帮助。
  • SQL 不是这样工作的。文字字符串不能用于替换对象的名称(也不能用于变量)。 DECLARE @table sysname = N'dbo.MyTable'; SELECT * FROM @table; 不会 SELECT 来自 dbo.MyTable 的行它会给出关于未声明的表变量 @table 的错误。这似乎是您真正拥有的是需要修复的糟糕的数据库设计。
  • 我添加了使用的数据......并且我认为当我们处理18个不同数据库的合并时设计符合预期
  • 那是你的问题@3pepe3,你认为设计是正确的。你不应该有很多*_src 列,你应该有一个src 列,其值类似于123 等。然后你就可以轻松地做你需要的事情到。

标签: sql sql-server concat


【解决方案1】:

你可以尝试做一个函数,输出是你想要左连接的值。您的输出应该是单个值,与类型无关。然后,将其称为:

LEFT JOIN 
    (func_name(param1,param2,...) AS CONCAT(...) FROM DUAL)
ON 1=1

结果应该是在您需要的任何列名下与当前表连接的值。唯一的问题是您需要为每一行一个一个地执行此操作,因此它仅对较小的表真正有用。希望您提供更多信息,以便我提供更好的答案,但是当我在重命名列时遇到类似问题时,这对我有用。

【讨论】:

    猜你喜欢
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多