【问题标题】:SQL - replace returned data with other dataSQL - 用其他数据替换返回的数据
【发布时间】:2015-09-05 08:05:18
【问题描述】:

我正在使用以下 SQL 语法检索数据:

SELECT TOP 5 EventId, EventTime, DeviceName, Comment, Tenant, TenantName, Individual, 
                InetDb.dbo.Individuals.FirstName, InetDb.dbo.Individuals.LastName, InetDb.dbo.IndivImages.UserImage
                FROM taclogdata.dbo.Event
                LEFT JOIN InetDb.dbo.Tenants
                    ON taclogdata.dbo.Event.Tenant = InetDb.dbo.Tenants.TenantId
                LEFT JOIN InetDb.dbo.Individuals
                    ON taclogdata.dbo.Event.Individual = InetDb.dbo.Individuals.IndivId 
                    AND taclogdata.dbo.Event.Tenant = InetDb.dbo.Individuals.TenantNdx
                LEFT JOIN InetDb.dbo.IndivImages
                    ON InetDb.dbo.Individuals.IndivId = InetDb.dbo.IndivImages.IndivNdx
                    AND InetDb.dbo.Individuals.TenantNdx = InetDb.dbo.IndivImages.TenantNdx
                WHERE (taclogdata.dbo.Event.EventTime  > DATEADD(hh, -3, GETDATE())AND taclogdata.dbo.Event.EventTime < GETDATE())
                    AND (taclogdata.dbo.Event.Comment='Reader entry' OR taclogdata.dbo.Event.Comment='Reader exit')
                    AND (taclogdata.dbo.Event.DeviceName = 'L9 1/4/1' 
                        OR taclogdata.dbo.Event.DeviceName='L1 2/1/1-2 MainD'
                        OR taclogdata.dbo.Event.DeviceName='L1 2/1/3-4 MainD'
                        OR taclogdata.dbo.Event.DeviceName='L1 2/6/1-2 Stair'
                        OR taclogdata.dbo.Event.DeviceName='L1 2/2/1-2 FDT1')
                ORDER BY taclogdata.dbo.Event.EventTime DESC

此代码运行良好,但我正在尝试简化结果。
我试图通过替换例如 DeviceName 值来简化查询返回的内容。 L1 2/1/3-4 MainDMain Door 显示结果时(不替换数据库中的实际数据)

请问我该如何实现?
在此先感谢,
J

【问题讨论】:

  • 这取决于你是想要一个替代品还是一堆不同的。我已经把我的两个建议都加给你了。
  • 您还应该将ORs 的系列更改为单个IN 语句。
  • @a_horse_with_no_name - SQL Server 2005

标签: sql sql-server select sql-server-2005


【解决方案1】:

试试这个使用替换功能

SELECT TOP 5 EventId, EventTime, replace(DeviceName,'L1 2/1/3-4 MainD','L1 2/1/3-4 Main Door') as DeviceName, Comment, Tenant, TenantName, Individual, 
                InetDb.dbo.Individuals.FirstName, InetDb.dbo.Individuals.LastName, InetDb.dbo.IndivImages.UserImage
                FROM taclogdata.dbo.Event
                LEFT JOIN InetDb.dbo.Tenants
                    ON taclogdata.dbo.Event.Tenant = InetDb.dbo.Tenants.TenantId
                LEFT JOIN InetDb.dbo.Individuals
                    ON taclogdata.dbo.Event.Individual = InetDb.dbo.Individuals.IndivId 
                    AND taclogdata.dbo.Event.Tenant = InetDb.dbo.Individuals.TenantNdx
                LEFT JOIN InetDb.dbo.IndivImages
                    ON InetDb.dbo.Individuals.IndivId = InetDb.dbo.IndivImages.IndivNdx
                    AND InetDb.dbo.Individuals.TenantNdx = InetDb.dbo.IndivImages.TenantNdx
                WHERE (taclogdata.dbo.Event.EventTime  > DATEADD(hh, -3, GETDATE())AND taclogdata.dbo.Event.EventTime < GETDATE())
                    AND (taclogdata.dbo.Event.Comment='Reader entry' OR taclogdata.dbo.Event.Comment='Reader exit')
                    AND (taclogdata.dbo.Event.DeviceName = 'L9 1/4/1' 
                        OR taclogdata.dbo.Event.DeviceName='L1 2/1/1-2 MainD'
                        OR taclogdata.dbo.Event.DeviceName='L1 2/1/3-4 MainD'
                        OR taclogdata.dbo.Event.DeviceName='L1 2/6/1-2 Stair'
                        OR taclogdata.dbo.Event.DeviceName='L1 2/2/1-2 FDT1')
                ORDER BY taclogdata.dbo.Event.EventTime DESC

【讨论】:

  • 感谢您的回复@Mukesh。您能解释一下我如何将其应用于超过 1 个,例如将“L1 2/1/3-4 MainD”替换为“主门”。将 L1 2/1/3-4 MainD 替换为辅助主门。用楼梯门等替换“L1 2/6/1-2 Stair”
  • @joebegborg07 试试这个:replace(replace(DeviceName,'L1 2/6/1-2 Stair','L1 2/6/1-2 Stair Door'),'L1 2/1 /3-4 MainD','L1 2/1/3-4 Main Door')
【解决方案2】:

这里是我的建议:

如果您可以替换 SELECT 中的数据,例如:

SELECT REPLACE(DeviceName,N'2/1/3-4 MainD',N'Main Door')

如果你有很多替换,我建议创建一个临时表,加入它并从临时表中取出替换。

【讨论】:

    【解决方案3】:

    评论太长了。

    您问题的具体答案是使用REPLACE()CASE 语句。但是,您还应该将 WHERE 子句更改为使用 IN 并使用表别名,以便代码更易于编写和阅读:

    FROM taclogdata.dbo.Event e LEFT JOIN
         InetDb.dbo.Tenants t
         ON e.Tenant = t.TenantId LEFT JOIN
         InetDb.dbo.Individuals i
         ON e.Individual = i.IndivId AND e.Tenant = i.TenantNdx LEFT JOIN
         InetDb.dbo.IndivImages ii
         ON i.IndivId = ii.IndivNdx AND Ii.TenantNdx = ii.TenantNdx 
    WHERE (e.EventTime  > DATEADD(hour, -3, GETDATE()) AND 
           e.EventTime < GETDATE()
          ) AND
          e.Comment IN ('Reader entry', 'Reader exit') AND
          e.DeviceName IN ('L9 1/4/1', 'L1 2/1/1-2 MainD', 'L1 2/1/3-4 MainD',
                           'L1 2/6/1-2 Stair', 'L1 2/2/1-2 FDT1'
                          )
    

    【讨论】:

    • 谢谢戈登。我会阅读更多关于表别名的信息(所以我理解它的含义),我会采纳你的建议。
    猜你喜欢
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多