I'm trying to trim a column (ActionOutput) to only show two substrings in that column.
I need to only show the 8 characters entries that starts with either WRD or CAS.
The column can have any types/numbers of characters and they won't always contains entries with the specified patterns.
My query looks like this:
SELECT
TSRPT_C009 = ExecutionTime,
LastStatusMessageID,
LastStatusMessageIDName,
TSRPT_C007 = ExitCode,
TSRPT_C008 = ActionOutput,
(PATINDEX('%[cas][wrd]%',ActionOutput)) AS CASID
FROM v_TaskExecutionStatus tse
I also tried this:
substring(
(substring(ActionOutput,(CHARINDEX('WRD0',ActionOutput)),8)),(CHARINDEX('CAS0',ActionOutput)),8
) AS CASID
But it also didn't work for the second pattern.
Is there a way to search for multiples patterns in a string (returned from a select) and return it/them.
Thks in advance and don't heistate if you have any questions.
Steph
PATINDEX() returns an integer, not a string. You might try this:
(case when ActionOutput like '%cas%'
then substring(ActionOutput, charindex('cas', ActionOutput), 8)
when ActionOutput like '%wrd%'
then substring(ActionOutput, charindex('wrd', ActionOutput), 8)
end) as caswrd_8
Related
how do I write a SQL where statement that checks if a string contains some substring and a number. For example:
string: macsea01
where string like 'macsea' plus a number
Regex is the most obvious solution to this question. Without more detail about the specific format of the string, I can suggest the following, which will match a sequence of a letter in the alphabet followed immediately by a digit:
where column_name like '%[a-zA-Z][0-9]%'
If you're literally looking for macsea at the beginning of the string followed by a digit, it would be:
where column_name like 'macsea[0-9]%'
Regex seem to bee a little slippery here, depending on your needs you can for instance divide the string into several parts, first the text part, and take the rest of the string, try to convert it into a number.
Somthing like this (but I think this perticular code is broken
where substring(column_name, 1, 6) = 'macsea' and cast(substring(column_name, 7, 1000) as int) > 0
I have a string in table column like below
1. "C-DERD,C-FDER,E-FDFE,E-DFE,C-DFERE"
2. "E-FDFE,C-DFEC,E-DFDFE,E-DE"
If I search for a string like "DE" then it will first check all the individual string that starts with 'C-' AS LIKE CONSTRAINT IN TABLE. If it is found, then it will return TRUE in separate column, in second case it is not found in 'C-' case then it will check in all individual string that start with 'E-' but it is same as searched string. With use of CHARINDEX function only.
As I mention in a comment, you should fix the data structure. Sometimes, though, we are stuck with other people's really bad designs and are not in a position to fix them.
One method is to split the string, although that is a bit painful. In your case you could do:
select t.*,
(case when str like '%CE-DE%' then 1
when str like '%CE-[^,]DE%' then 1
when str like '%CE-[^,][^,]DE%' then 1
when str like '%CE-[^,][^,][^,]DE%' then 1
else 0
end) as flag
This looks for up to three intervening characters between the - and DE, which is sufficient for your examples.
I have a table that contains 6 digit ID numbers ('AB1E11' for example) and I need to build a query in Teradata SQL that returns all results where 'E' is in the fourth position of the string. I haven't had a reason to do anything like this in several years, so I am extremely rusty. I know how to filter the results so that 'E' is contained anywhere in the string ( using SELECT * WHERE PLANID LIKE '%E%'), but I'm not sure how to filter the results so that only the ones where 'E' is in the 4th position show up. Can anyone help me out with this? I tried searching several times but couldn't find an answer.
Thank you.
Just use LIKE with the _ wildcard:
where planid like '____E%'
Note: that is 4 underscores, which represent any single character.
SELECT planid WHERE CHARINDEX('E', planid) = 4;
The starting position returned is 1-based, not 0-based.
How can i query a column with Names of people to get only the names those contain exactly 2 “a” ?
I am familiar with % symbol that's used with LIKE but that finds all names even with 1 a , when i write %a , but i need to find only those have exactly 2 characters.
Please explain - Thanks in advance
Table Name: "People"
Column Names: "Names, Age, Gender"
Assuming you're asking for two a characters search for a string with two a's but not with three.
select *
from people
where names like '%a%a%'
and name not like '%a%a%a%'
Use '_a'. '_' is a single character wildcard where '%' matches 0 or more characters.
If you need more advanced matches, use regular expressions, using REGEXP_LIKE. See Using Regular Expressions With Oracle Database.
And of course you can use other tricks as well. For instance, you can compare the length of the string with the length of the same string but with 'a's removed from it. If the difference is 2 then the string contained two 'a's. But as you can see things get ugly real soon, since length returns 'null' when a string is empty, so you have to make an exception for that, if you want to check for names that are exactly 'aa'.
select * from People
where
length(Names) - 2 = nvl(length(replace(Names, 'a', '')), 0)
Another solution is to replace everything that is not an a with nothing and check if the resulting String is exactly two characters long:
select names
from people
where length(regexp_replace(names, '[^a]', '')) = 2;
This can also be extended to deal with uppercase As:
select names
from people
where length(regexp_replace(names, '[^aA]', '')) = 2;
SQLFiddle example: http://sqlfiddle.com/#!4/09bc6
select * from People where names like '__'; also ll work
I want to get only those rows that contain ONLY certain characters in a column.
Let's say the column name is DATA.
I want to get all rows where in DATA are ONLY (must have all three conditions!):
Numeric characters (1 2 3 4 5 6 7 8 9 0)
Dash (-)
Comma (,)
For instance:
Value "10,20,20-30,30" IS OK
Value "10,20A,20-30,30Z" IS NOT OK
Value "30" IS NOT OK
Value "AAAA" IS NOT OK
Value "30-" IS NOT OK
Value "30," IS NOT OK
Value "-," IS NOT OK
Try patindex:
select * from(
select '10,20,20-30,30' txt union
select '10,20,20-30,40' txt union
select '10,20A,20-30,30Z' txt
)x
where patindex('%[^0-9,-]%', txt)=0
For you table, try like:
select
DATA
from
YourTable
where
patindex('%[^0-9,-]%', DATA)=0
As per your new edited question, the query should be like:
select
DATA
from
YourTable
where
PATINDEX('%[^0-9,-]%', DATA)=0 and
PATINDEX('%[0-9]%', LEFT(DATA, 1))=1 and
PATINDEX('%[0-9]%', RIGHT(DATA, 1))=1 and
PATINDEX('%[,-][-,]%', DATA)=0
Edit: Your question was edited, so this answer is no longer correct. I won't bother updating it since someone else already has updated theirs. This answer does not fulfil the condition that all three character types must be found.
You can use a LIKE expression for this, although it's slightly convoluted:
where data not like '%[^0123456789,!-]%' escape '!'
Explanation:
[^...] matches any character that is not in the ... part. % matches any number (including zero) of any character. So [^0123456789-,] is the set of characters that you want to disallow.
However: - is a special character inside of [], so we must escape it, which we do by using an escape character, and I've chosen !.
So, you match rows that do not contain (not like) any character that is not in your disallowed set.
Use option with PATINDEX and LIKE logic operator
SELECT *
FROM dbo.test70
WHERE PATINDEX('%[A-Z]%', DATA) = 0
AND PATINDEX('%[0-9]%', DATA) > 0
AND DATA LIKE '%-%'
AND DATA LIKE '%,%'
Demo on SQLFiddle
As already mentioned u can use a LIKE expression but it will only work with some minor modifications, otherwise too many rows will be filtered out.
SELECT * FROM X WHERE T NOT LIKE '%[^0-9!-,]%' ESCAPE '!'
see working example here:
http://sqlfiddle.com/#!3/474f5/6
edit:
to meet all 3 conditions:
SELECT *
FROM X
WHERE T LIKE '%[0-9]%'
AND T LIKE '%-%'
AND T LIKE '%,%'
see: http://sqlfiddle.com/#!3/86328/1
Maybe not the most beautiful but a working solution.