Solved

Concat and insert if not blank

Posted on 2014-01-27
8
559 Views
Last Modified: 2014-01-28
I have the following which works fine

INSERT INTO product_images (product_image_name,sku)
select concat_ws(';',image1,image2,image3),item from import
ON DUPLICATE KEY UPDATE product_image_name=concat_ws(';',image1,image2,image3)

But I want to add some conditions:
If either image1,image2 or image3 is blank (will be blank and not NULL) then don't include that particular field.
If all fields are blank then skip

Is it possible? Would this make the sql very complicated? I can live with inserting 'blank' fields (as I will just do a delete on them) but would really like the empty fields to be skipped.
0
Comment
Question by:Gary
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
8 Comments
 
LVL 25

Accepted Solution

by:
chaau earned 500 total points
ID: 39813951
yes, it is possible. Use NULLIF() function to convert empty columns to NULLs, that will in turn be skipped by concat_ws. Also, add an additional condition to your select statement to skip all NULL values:
INSERT INTO product_images (product_image_name,sku)
select concat_ws(';',NULLIF(image1,''),NULLIF(image2,''),NULLIF(image3,'')),item 
from import WHERE NULLIF(image1,'') IS NOT NULL AND 
NULLIF(image2,'') IS NOT NULL AND
NULLIF(image3,'') IS NOT NULL
ON DUPLICATE KEY UPDATE product_image_name=concat_ws(';',NULLIF(image1,''),NULLIF(image2,''),NULLIF(image3,''))

Open in new window

0
 
LVL 58

Author Comment

by:Gary
ID: 39813961
That kinda works but it isn't pulling rows where for example image1 does have a value but image2 and image3 don't.
Presumably because you are conditioning that all cols must have a value
from import WHERE NULLIF(image1,'') IS NOT NULL AND
NULLIF(image2,'') IS NOT NULL AND
NULLIF(image3,'') IS NOT NULL


...where I just want skip the fields if they are blank.
I can live with it and do a delete on the blank fields by removing the WHERE condition unless you have a better solution.
0
 
LVL 25

Assisted Solution

by:chaau
chaau earned 500 total points
ID: 39813987
You are right. My mistake. Change the where clause to this:
where not (NULLIF(image1,'') IS NULL AND 
NULLIF(image2,'') IS NULL AND
NULLIF(image3,'') IS NULL)

Open in new window

0
Creating Instructional Tutorials  

For Any Use & On Any Platform

Contextual Guidance at the moment of need helps your employees/users adopt software o& achieve even the most complex tasks instantly. Boost knowledge retention, software adoption & employee engagement with easy solution.

 
LVL 78

Expert Comment

by:arnold
ID: 39814018
I am unclear what it is you are looking to do.
I think it will be more efficient to leave it as you have it.
image1;image2;image3;

if you make the concat conditional (other than complicating the query) you could have results
;;;
image1;;image3
versus
image1;image3
image3
image2;image3

Presumably there is a significance placed on that order when you decode/split the data from the column based on ';'
0
 
LVL 15

Expert Comment

by:Jagadishwor Dulal
ID: 39814035
I think you are almost at the point write a function to check the condition and change your query as per required. And again if you want to having blank then use default value to blank in your database.
0
 
LVL 110

Expert Comment

by:Ray Paseur
ID: 39814846
Not sure of the overall design, but it feels to me like the product_image_name should be a separate table rather than a variable number of image names in a single column.  Just a thought... ~Ray
0
 
LVL 58

Author Comment

by:Gary
ID: 39815495
@chaau
The amendment seems to work fine, will just do a bit more testing to make sure nothing is missing.
0
 
LVL 58

Author Comment

by:Gary
ID: 39815990
Thanks, works fine.
0

Featured Post

Webinar: Aligning, Automating, Winning

Join Dan Russo, Senior Manager of Operations Intelligence, for an in-depth discussion on how Dealertrack, leading provider of integrated digital solutions for the automotive industry, transformed their DevOps processes to increase collaboration and move with greater velocity.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Does the idea of dealing with bits scare or confuse you? Does it seem like a waste of time in an age where we all have terabytes of storage? If so, you're missing out on one of the core tools in every professional programmer's toolbox. Learn how to …
Since pre-biblical times, humans have sought ways to keep secrets, and share the secrets selectively.  This article explores the ways PHP can be used to hide and encrypt information.
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
The viewer will learn how to count occurrences of each item in an array.

726 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question