Hello Sam and Dorine,
From what I understood, the SearchString is a previous concatenation of a string and integer. So, maybe, I guess you may have two input fields. What I mean is that the source comes from two different places.
So it may go like: "xxx-123" or "-123" or "xxx-". The SearchString is already a text attribute, even if you only send a number because it concatenates with the "-".
If, in the Database, the name goes already defined in a single attribute, it should look like this: ABC-123, BCD-456... XYZ-123
So, when you do the filter, you just need to care about:
SearchString = ""
or
Name like "%" + SearchString + "%"
The extra filters will not be necessary in this case (from what I understood).
(Note that if you send everything "ABC-123" in the String and nothing in the integer field, you might be getting empty results because you will be searching for "ABC-123-" with the extra "-".)
Also, in your first post, after seeing that Name and Number attributes are smaller than the concatenated string, you might be getting less results because the order would be :
SearchString like "%" + Name + "%" instead of
Name like "%" + SearchString + "%" (this will be false because Name is 'ABC' and SearchString is 'ABC-123')
Second Case: (most likely)
If in the Database, the information is stored differently (across different attributes), my advice would be to create a new attribute in the aggregate, instead of doing functions in the filter. Like this:

The concatenation of attributes will generate the unique combination that you want for each record. And, since you are mixing numbers with strings, this calculated attribute will be a string.
At this point, you can do the search directly to that new attribute:
SearchString = ""
or
Attribute1 like "%" + SearchString + "%"
I hope this helps, and that you find the easiest solution for your application.
Cheers,
Rúben