This a follow-up to a question from 9/15/25: Query that checks if an item name contains a substring, and if true, perform a second query that grabs an image with a specific name
I have a query that grabs image data from tables joined on substrings. The item substring I need to match changes depending on the item so I need to run multiple queries. Example: https://dbfiddle.uk/ZrUkfuab
create table image(
image_name text,
image_data bytea
);
INSERT INTO image
VALUES ( 'PRODUCT ANALOG DATASHEET',
Convert_to(Md5(Random() :: text), 'UTF8')),
('PRODUCT ANALOG DATASHEET',
Convert_to(Md5(Random() :: text), 'UTF8')),
('PRODUCT MAIN DATASHEET',
Convert_to(Md5(Random() :: text), 'UTF8')),
('PRODUCT FRAM DATASHEET',
Convert_to(Md5(Random() :: text), 'UTF8')),
('PRODUCT AAAA DATASHEET',
Convert_to(Md5(Random() :: text), 'UTF8')),
('PRODUCT BD DATASHEET',
Convert_to(Md5(Random() :: text), 'UTF8'));
create table wo(wo_id int,item_number text);
insert into wo values(1,'PRODUCT - MAIN BD - FRAM-MSTRW/O FBR')
,(2,'PRODUCT-ANLG-GIC2B-2AIN')
,(3,'PRODUCT - ANALOG BD - 4CT/4AIN')
,(4,'PRODUCT-AAAA-BBBBB-4XX');
create table Patterns(Pattern_id int, PatternString text);
insert into Patterns values(1,'^PRODUCT - MAIN BD -.(\w+).*')
,(2,'^PRODUCT-ANLG.(\w+).*')
,(3,'^PRODUCT -.(\w+).*')
,(4,'^PRODUCT.(\w+).*');
This successfully returns the image data:
SELECT item_number, image_name, image_data
FROM wo
JOIN image ON REGEXP_REPLACE(image_name,'^PRODUCT.(\w+).*','\1')
=REGEXP_REPLACE(item_number,(SELECT PatternString
FROM Patterns
WHERE Pattern_id = 3),'\1')
WHERE wo_id=3;
A different pattern results in zero matches, no results:
SELECT item_number, image_name, image_data
FROM wo
JOIN image ON REGEXP_REPLACE(image_name,'^PRODUCT.(\w+).*','\1')
=REGEXP_REPLACE(item_number,(SELECT PatternString
FROM Patterns
WHERE Pattern_id = 4),'\1')
WHERE wo_id=3;
This third block combines both queries. The query that doesn’t return anything is first, followed by one that does. This block successfully returns the image data, from the second query in it.
SELECT item_number, image_name, image_data
FROM wo
JOIN image ON REGEXP_REPLACE(image_name,'^PRODUCT.(\w+).*','\1')
=REGEXP_REPLACE(item_number,(SELECT PatternString
FROM Patterns
WHERE Pattern_id = 4),'\1')
WHERE wo_id=3;
SELECT item_number, image_name, image_data
FROM wo
JOIN image ON REGEXP_REPLACE(image_name,'^PRODUCT.(\w+).*','\1')
=REGEXP_REPLACE(item_number,(SELECT PatternString
FROM Patterns
WHERE Pattern_id = 3),'\1')
WHERE wo_id=3;
However, when I flip the order of queries in this block, no image data is returned. The (lack of) result of the second query seems to be overriding the result of the first query.
How to get around it? For loops? Case Expressions? CTE’s?
I really don’t want to give each query its own dedicated block because it would make organizing the report template a complete nightmare.
postgresql-9.6from the start, so changing the version to make it go away isn't an argument against the question but rather one of potential solutions. An unlikely one, because OP would have to upgrade xtuple to make that work in their target environment, but a good one nevertheless.