On 12-Jan-2016 07:13 -0700, Craig Jacobsen wrote:
I need to search multiple fields from 2 joined files. (there may not
be a record in 2nd file)
I am concatenating all the fields together and separating them with a
delimiter of | eg.
Is there a way to do a LIKE '%string%' on the result
Yes, a LIKE predicate can be performed against the result of the
concatenation.
But for most scenarios, there would be little justification to have
done so. Such scenarios could be likened to producing a spooled report
without selection, simply to enable scanning\parsing the report output,
to pare the results to only those report-lines that are of interest.
And mostly, having produced the final report from the row-data pared
within the query selection would be the better option. So in this
particular scenario, why not just perform selection on the values in the
columns [instead of a LIKE on the expression involving those columns]?
There is also the potential problem of false-positive results from
using a LIKE on the concatenated row-data; e.g. LIKE '%|WY%' might
intend to yield the result from a STATE_CODE column, but instead yield
a[n unexpected] result from a descriptive-text field ITEM_DESC. In that
case, the choice for selection on the columns vs on the expression will
seem more conspicuous; i.e. use of WHERE STATE_CODE='WY' instead of
WHERE Concat_Expression LIKE '%|WY%' is more accurate, but also can be
much faster.
Be aware that using a the LIKE predicate in a WHERE clause using the
LEFT JOIN so as to include unmatched rows, requires either coalescing
all column values in the concatenation expression, coalescing the
expression itself, or adding predicate logic:
OR Concat_Expression IS NULL
or do I have to get the string and then do a %scan on the string
after it is fetched.
FWiW, the SQL LIKE could be used in that context as well; i.e. as an
SQLhll program, the use of SQL predicates is not limited to just the
SELECT. I am not making a recommendation, just clarifying that
deferring to the HLL scanning is not required; if for example, the
effects of the LIKE [such as shared sort sequence] are more desirable.
I may have more than one string to LIKE or %SCAN on. There are about
100k records in the file.
dcl-ds DATA;
ItmString char(434) pos(1);
ItmNum char(20) pos(435);
end-ds;
I'm thinking it would be faster if the SQL handled it, but I may be
wrong.
The SQL can be faster, but without parallel data access, the
algorithms are effectively the same. Unless the LIKE is eliminated, the
effect from the query will be to read every row, further diminishing the
value of using the SQL to do the work. Having the program perform
multiple scans [more than one string to test] may also be /simpler/ in
the HLL than what might be accomplished using multiple "OR"ed LIKE
predicates on the SQL. Actual examples of data and inputs for the
search including how they are obtain, plus known boundaries [e.g. max
number of scans], would be good information to share when describing the
scenario.
Select
Trim(a.ItmNum)||'|'||
Trim(ItmDsc) ||'|'||
Trim(Vendor) ||'|'||
Trim(VnCode) ||'|'||
Trim(VnItmD) ||'|'||
Trim(CsDmti) ||'|'||
Trim(ItmSeq) ||'|'||
Trim(ItmSq2) ||'|'||
Trim(ItmUpc) ||'|'||
coalesce(trim(It60Ds),'-----') name
, a.ItmNum
FROM ItmMst a
left Outer Join
ItmAds b
On a.ItmNum = b.ItmNum
order by a.itmnum,b.itmnum
Given the equivalence of ItmNum betwixt, even with the possible NULL
result, the second column for ordering would seem redundant.?
Without the ORDER BY, the above can be encapsulated in a VIEW; if so
inclined, if for example the selection on the expression named NAME is
really sensible in the given scenario.
As an Amazon Associate we earn from qualifying purchases.