1
votes

Générer une URL à partir de données de tables SQL

Considérez les tableaux suivants:

EntityPictures Table:

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

Images Table

XXX

Je souhaite écrire une requête pour imprimer la liste des Produits avec la colonne PictureUrl générée, basée sur imagesize code > input

psudo code:

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

la taille de l'image n'est pas une colonne d'une table, elle est juste utilisée pour générer des URL

Résultat attendu:

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

Mettre à jour

dans 1_seoFilename1_200.png , 1 est l'identifiant de l'image, 100 et 200 sont générés en fonction de la clause where. si nous n'avions que où imagesize = 100, le résultat attendu sera

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

Et @id est EntityId dans Table EntityPictures .


13 commentaires

pourriez-vous partager la structure de votre table Produits?


La table des produits n'a pas d'importance, elle n'a que la colonne Id et Nom.


mais qu'en est-il du reste de votre clause where?


d'où vous obtenez la valeur de votre URL http: // localhost / content / images / thumbs /


où sont les colonnes imagesize et imagesize ?


Je veux générer 2 URL en fonction de la clause where


comment obtenir la taille d'image en fonction de vos lignes existantes alors?


chaque image peut avoir n'importe quel nombre de taille d'image, elle est générée automatiquement. et ce n'est pas persister.


alors pourquoi avez-vous besoin de WHERE pour la taille d'image lorsqu'elle est générée automatiquement?


car la taille de l'image est une entrée de l'utilisateur, pour générer une URL avec cette taille


donc c'est un paramètre, pas une condition


Oui, tu as raison


vous passez donc la taille de l'image une par une dans un paramètre comme 100 pour une fois, puis 200 ou passez cette taille d'image dans un autre format, car il y a 2 valeurs mentionnées par vous dans requete.


3 Réponses :


3
votes

Voici votre requête.

pour extraire png de image / png , utilisez celle-ci

    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

Requête complète (pour un seul paramètre)

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 

Pour générer N nombre de lignes, vous pouvez utiliser CTE.

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


6 commentaires

EntityId n'est pas une colonne de la table Images


imagesize n'est pas une colonne d'une table, sa seule entrée pour générer des URL


il manque quelque chose à l'exigence.


Veuillez mettre à jour votre réponse pour utiliser la taille de l'image comme paramètre (nous pouvons avoir un tableau de tailles)


merci, cela fonctionne, mais je veux sélectionner *, imageUrl de la table products et imageSizes sont un tableau d'int


vous pouvez utiliser CTE si vous souhaitez générer N nombre de lignes.



-1
votes

Tout d'abord, je suppose que votre tableau Picture a une colonne qui spécifie la 'taille de l'image'?

si tel est le cas, essayez ce qui suit:

SELECT ('http: //localhost/content/images/thumbs/66_'+seoFilename1+'_'+imagesize+'.png') AS PictureUrl DE Images WHERE Id = @id AND (taille d'image = 100 ou taille d'image = 200)

Veuillez également noter que 'localhost' devra être changé une fois en production.


4 commentaires

localhost est constant, mais seofilename est dans la table Pictures


et dans quelle table se trouve votre colonne imagefilesize ?


il n'existe pas, j'aimerais le générer, en fonction de la clause where


une clause WHERE est là pour évaluer le résultat souhaité d'un utilisateur avec l'ensemble de résultats de votre requête (condition), si imagefilesize n'existe dans aucune table, vous ne pouvez pas l'utiliser dans votre clause WHERE veuillez vous familiariser avec SQL avant de poster des questions.



0
votes

Exemple de date:

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

Ma solution basée sur la solution métal : p>

    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


0 commentaires