Can't you just get the numbers from the string and use it in the BETWEEN clause ? Considering it always starts with 3 letters :
Ex :
CREATE TABLE TEST (
ID NUMBER PRIMARY KEY,
TEXT VARCHAR(255)
);
INSERT INTO TEST(ID, TEXT) VALUES(1, 'sku1');
INSERT INTO TEST(ID, TEXT) VALUES(2, 'sku2');
INSERT INTO TEST(ID, TEXT) VALUES(3, 'sku3');
INSERT INTO TEST(ID, TEXT) VALUES(4, 'sku4');
INSERT INTO TEST(ID, TEXT) VALUES(5, 'sku23');
INSERT INTO TEST(ID, TEXT) VALUES(6, 'sku40');
INSERT INTO TEST(ID, TEXT) VALUES(7, 'sku123');
Then :
SELECT *
FROM TEST
WHERE TO_NUMBER(SUBSTR(TEXT, 4)) BETWEEN 3 AND 30;
Result :
|--------------|--------------|
| ID | TEXT |
|--------------|--------------|
| 3 | sku3 |
| 4 | sku4 |
| 5 | sku23 |
|--------------|--------------|
Or of course if you need the strings in the BETWEEN clause :
SELECT *
FROM TEST
WHERE TO_NUMBER(SUBSTR(TEXT, 4)) BETWEEN TO_NUMBER(SUBSTR('sku3', 4)) AND TO_NUMBER(SUBSTR('sku30', 4))
Try the fiddle.
EDIT :
According to the comment, if you need to get the last digits from the string, you can use the following (uses REGEXP_SUBSTR function and a regexp to extract the digits from the end of the string) :
SELECT *
FROM TEST
WHERE TO_NUMBER(REGEXP_SUBSTR(TEXT,'\d+$')) BETWEEN 3 AND 30;
\d+ matches a group of digits.
$ matches end of line.
New fiddle.
sku2,sku3andsku4exist?