【问题标题】:Generate URL from sql tables data从 sql 表数据生成 URL
【发布时间】:2019-08-28 06:11:43
【问题描述】:

考虑下表:

EntityPictures表:

Id  EntityId    PictureId  EntityType
1     66              1     Product

Pictures

Id  MimeType    SeoFilename  AltAttribute   TitleAttribute  
1   image/png   seoFilename1 altAttribute1  titleAttribute1 
2   image/png       seox         altx               titlex

我想写一个查询来打印Products 的列表,并根据imagesize 输入生成PictureUrl

伪代码:

@imageSizes={100,200}
foreach(imagesize in @imageSizes)
    select *,PictureUrl from products where Id=@id  

图片大小不是任何表格的一列,它只是用来生成url

预期结果:

Id   PictureUrl
10  http://localhost/content/images/thumbs/1_seoFilename1_100.png
11  http://localhost/content/images/thumbs/1_seoFilename1_200.png

更新

1_seoFilename1_200.png中,1是图片ID,100和200是根据where子句生成的。如果我们只有 where imagesize=100 ,预期的结果将是

Id   PictureUrl
10  http://localhost/content/images/thumbs/1_seoFilename1_100.png

@idEntityPictures 表中是EntityId

【问题讨论】:

  • 能否分享一下您的 Products 表结构?
  • 产品表无所谓,只有Id和Name列。
  • 但是你的 where 子句的其余部分呢?
  • 所以它是一个参数,而不是一个条件
  • 所以你在参数中一个一个地传递图像大小,比如100 一次,然后200 或以其他格式传递这个图像大小,因为你在查询中提到了2个值。

标签: sql sql-server tsql substring common-table-expression


【解决方案1】:

这是您的查询。

要从image/png 中提取png,使用这个

substring(pt.MimeType, charindex('/', pt.MimeType, 1) + 1, 
        len(pt.MimeType) - 1)

完整查询(针对单个参数)

select ep.Id,
    concat('http://localhost/content/images/thumbs/'
      , ep.Id, '_', pt.SeoFilename, '_', @imgSize, '.', 
      substring(pt.MimeType, charindex('/', pt.MimeType, 1) + 1, 
        len(pt.MimeType) - 1)
    ) as PictureURL
from EntityPictures ep 
join Pictures pt on pt.Id= ep.EntityId
where ep.Id=@id 

要生成 N 行,您可以使用 CTE。

    with MultiRows (RowNum, ImageSize) as (      
       select 1 as RowNum, 100 AS ImageSize
       union all          
       select a.RowNum + 1, a.ImageSize + 100 AS ImageSize
       from   MultiRows a
       where  a.RowNum < 2
    )
    select t1.Id,  
            concat('http://localhost/content/images/thumbs/'
              , t1.Id, '_', t1.SeoFilename, '_', m.ImageSize, '.', 
              substring(t1.MimeType, charindex('/', t1.MimeType, 1) + 1, 
                len(t1.MimeType) - 1)
            ) as PictureURL 
    from  MultiRows m
    left join (
                select row_number() over (order by ep.id) as rn, ep.Id, pt.SeoFilename, pt.MimeType
                    from EntityPictures ep 
                join Pictures pt on pt.Id= ep.EntityId
                where ep.Id=@id 
            ) t1 on m.ROwNum = t1.rn;
    go

【讨论】:

  • EntityId 不是图片表的列
  • imagesize 不是任何表的列,它是生成 url 的唯一输入
  • 要求中缺少某些内容。
  • 请更新您的答案以使用 imagesize 作为参数,(我们可以有尺寸数组)
  • 谢谢,这行得通,但我想从 products 表中选择 *,imageUrl 并且 imageSizes 是 int 数组
【解决方案2】:

样品日期:

    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Products](
        [Id] [int] NULL,
        [Name] [nvarchar](50) NULL
    ) ON [PRIMARY]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[EntityPictures](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [EntityId] [int] NOT NULL,
        [PictureId] [int] NOT NULL,
        [DisplayOrder] [int] NOT NULL,
        [IsDefault] [bit] NOT NULL,
        [EntityType] [nvarchar](max) NULL,
     CONSTRAINT [PK_EntityPictures] PRIMARY KEY CLUSTERED 
    (
        [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Pictures](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [PictureBinary] [varbinary](max) NULL,
        [MimeType] [nvarchar](max) NULL,
        [SeoFilename] [nvarchar](max) NULL,
        [AltAttribute] [nvarchar](max) NULL,
        [TitleAttribute] [nvarchar](max) NULL,
        [IsNew] [bit] NOT NULL,
     CONSTRAINT [PK_Pictures] PRIMARY KEY CLUSTERED 
    (
        [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    INSERT [dbo].[Products] ([Id], [Name]) VALUES (66, N'P1')
    INSERT [dbo].[Products] ([Id], [Name]) VALUES (67, N'P2')
    SET IDENTITY_INSERT [dbo].[EntityPictures] ON 

    INSERT [dbo].[EntityPictures] ([Id], [EntityId], [PictureId], [DisplayOrder], [IsDefault], [EntityType]) VALUES (1, 66, 1, 0, 0, N'Product')
    SET IDENTITY_INSERT [dbo].[EntityPictures] OFF
    SET IDENTITY_INSERT [dbo].[Pictures] ON 

    INSERT [dbo].[Pictures] ([Id], [PictureBinary], [MimeType], [SeoFilename], [AltAttribute], [TitleAttribute], [IsNew]) VALUES (1, 0x, N'image/png', N'seoFilename1', N'altAttribute1', N'titleAttribute1', 0)
    INSERT [dbo].[Pictures] ([Id], [PictureBinary], [MimeType], [SeoFilename], [AltAttribute], [TitleAttribute], [IsNew]) VALUES (2, 0x, N'image/png', N'seoFilenameoo', N'altAttributeoo', N'titleAttributeoo', 0)
    SET IDENTITY_INSERT [dbo].[Pictures] OFF

我的解决方案基于metal 解决方案:

declare @listOfIDs table (id int);
insert @listOfIDs(id) values(100),(200);    
declare @id int=66;
declare @baseUrl varchar(256)='http://localhost/content/images/thumbs/';

    select id,name,PictureURL from (select * from products p
    join (select ep.EntityId,
        concat(@baseUrl
          , ep.Id, '_', pt.SeoFilename, '_', l.id, '.', 
          substring(pt.MimeType, charindex('/', pt.MimeType, 1) + 1, 
            len(pt.MimeType) - 1)
        ) as PictureURL
    from dbo.EntityPictures ep 
    join dbo.Pictures pt on pt.Id= ep.PictureId
    right join @listOfIDs l on l.id=l.id 
    ) t on 1=1) x
    where x.Id=@id

【讨论】:

    【解决方案3】:

    首先,我假设您的图片表有一个指定“图像大小”的列?

    如果是这样,请尝试以下方法:

    SELECT ('http://localhost/content/images/thumbs/66_'+seoFilename1+'_'+imagesize+'.png') AS PictureUrl FROM Pictures WHERE Id = @id AND (imagesize = 100 or imagesize = 200)

    还请注意,“localhost”一旦投入生产就必须更改。

    【讨论】:

    • localhost 是常量,但 seofilename 在图片表中
    • 您的imagefilesize 列在哪个表中?
    • 它不存在,我想根据where子句生成它
    • a WHERE 子句用于使用查询的结果集(条件)评估用户的期望结果,如果 imagefilesize 不存在于任何表中,则不能在 @ 中使用它987654325@子句发问题前请先熟悉SQL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2016-12-04
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    相关资源
    最近更新 更多