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 .
3 Réponses :
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)
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.
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.
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.
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
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
etimagesize
?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, puis200
ou passez cette taille d'image dans un autre format, car il y a 2 valeurs mentionnées par vous dans requete.