SQL subtracting a string column from another string column - sql

I am looking to subtract two string columns from another string column.
I have acheived this in the past in Oracle using the below
SELECT
C.MANUFACTURER,
C.MODEL_GROUP,
REGEXP_REPLACE(C.VARIANT, '^'||C.MANUFACTURER || ' +' || C.MODEL_GROUP) "VAR DESC",
C.VARIANT
FROM STD_BI.RL2_CONTRACTS_VW C
I now need to acheive the same in MS SQL any suggestions would be appreciated.

"Subtract" is surely a misnomer here. The OP appears to want to remove a string at the beginning of another string.
From this point on, I am assuming that MANUFACTURER and MODEL_GROUP do not contain any regular expression wildcard characters.
There is a challenge with multiple spaces. If there are not too many, then you can do. For instance, this handles one or two spaces:
SELECT C.MANUFACTURER, C.MODEL_GROUP,
(CASE WHEN C.VARIANT LIKE C.MANUFACTURER + ' ' + C.MODEL_GROUP + '%'
THEN STUFF(C.VARIANT, 1, LEN(C.MANUFACTURER + ' ' + C.MODEL_GROUP), '')
WHEN C.VARIANT LIKE C.MANUFACTURER + ' ' + C.MODEL_GROUP + '%' AND
THEN STUFF(C.VARIANT, 1, LEN(C.MANUFACTURER + ' ' + C.MODEL_GROUP), '')
ELSE C.VARIANT
END) as [VAR DESC],
C.VARIANT
FROM STD_BI.RL2_CONTRACTS_VW C;
EDIT:
Here is a more complete solution:
SELECT C.MANUFACTURER, C.MODEL_GROUP,
(CASE WHEN C.VARIANT LIKE C.MANUFACTURER + ' %' + C.MODEL_GROUP + '%' AND
C.VARIANT NOT LIKE C.MANUFACTURER + ' %[^ ]%' + C.MODEL_GROUP + '%'
THEN STUFF(LTRIM(STUFF(C.VARIANT, 1, LEN(C.MANUFACTURER), '')), 1, LEN(C.MODEL_GROUP), '')
ELSE C.VARIANT
END) as [VAR DESC],
C.VARIANT
FROM STD_BI.RL2_CONTRACTS_VW C;
This tests for just spaces between the two strings (the not like is checking for something other than a space). The replacement is then in three steps -- remove the manufacturer, then the spaces, then the model group.

I have spent some time on this one as much for my own satisfaction and in addition to the answer above, I have come up with the following which also generates the correct answer.
SUBSTRING(FV.VARIANT, LEN(FV.MANUFACTURER + ' ' + FV.MODEL_RANGE + ' ') + 1 , LEN(FV.VARIANT))

My problem was kinda easier to solve, I just needed to remove "xxxx" (the first 4 characters) at the start of a column from some rows:
UPDATE coluna SET columToEdit = SUBSTRING(columToEdit, 5, 200);

Related

How do I catch a handle a null value in a concatenated string?

I have the following in a view
c2.title + ' ' + c2.initials + ' ' + c2.surname AS referredTo
As it stands now, if one of those values are null, then referredTo is just null. But for some of the records, the title, the initials, or the surname may be null. What is the best way to handle this so that is one or more of the values are null, it will return only the string with the non-null values. So for example, if title is null, it will only return "initals surname", if initials is null, it will return "title surname", if both are null, it will return "surname", etc, to cover any of those values being null. This is probably a really easy answer but I'm kinda new to SQL and having to learn as I go.
Thanks.
As suggested in the comment, put the White Space within the ISNULL:
SELECT ISNULL(Title + ' ', '') + ISNULL(Initials + ' ','') + ISNULL(Surname,'')
FROM YourTable;
That means that you don't end up with WhiteSpace at the front, or (possibly) two spaces between Title and Surname if Initials has a value of NULL.
Maybe you can use ISNULL, please check following statement
RTRIM(
LTRIM(
ISNULL(c2.title, '') + ' ' +
ISNULL(c2.initials, '') + ' ' +
ISNULL(c2.surname, '')
)
) AS referredTo
SET #FinalAnswer= ISNULL(#Col1, '') + ' ' +ISNULL(#Col2, '')
Try above approach.
Use Concat()
Select LTRIM(RTRIM(Concat(c2.title,' ',c2.initials,' ',c2.surname))) AS referredTo
FROM yourTable
DEMO

SELECT DISTINCT is omitting NULL values when not desired

I am trying to build a distinct string in a query, which works unless one of the values is NULL. I've tested removing LOCATION_ADDR_LINE_2, and the query will work just fine. When I do not SELECT DISTINCT, I find that LOCATION_ADDR_LINE_2 values are NULL. How can I gather these values in the SELECT DISTINCT even if NULL?
SELECT DISTINCT(LOCATION_ADDR_LINE_1 + ', ' + LOCATION_ADDR_LINE_2 + ', ' + LOCATION_CITY + ', ' + LOCATION_WORK_STATE) AS Addresses
FROM OracleReport
WHERE (LOCATION_ADDR_LINE_1 LIKE '%1135 Auto%' OR LOCATION_ADDR_LINE_1 LIKE '%199 Easy%')
Returns:
Addresses
NULL
SELECT DISTINCT(LOCATION_ADDR_LINE_1 + ', ' + LOCATION_CITY + ', ' + LOCATION_WORK_STATE) AS Addresses
FROM [OperationReport].[dbo].[OracleReport]
WHERE (LOCATION_ADDR_LINE_1 LIKE '%1135 Auto%' OR LOCATION_ADDR_LINE_1 LIKE '%199 Easy%')
Returns:
Addresses
1135 Auto...
189-199 Easy...
Assuming you don't mind text,,text,... (empty string) when a value is NULL...
SELECT DISTINCT(coalesce(LOCATION_ADDR_LINE_1,'') + ', ' +
coalesce(LOCATION_ADDR_LINE_2,'') + ', ' +
coalesce(LOCATION_CITY,'') + ', ' +
coalesce(LOCATION_WORK_STATE,'')) AS Addresses
FROM OracleReport
WHERE (LOCATION_ADDR_LINE_1 LIKE '%1135 Auto%'
OR LOCATION_ADDR_LINE_1 LIKE '%199 Easy%')
Coalesce will take the first non-null value and return it. It requires consistent data types and will early exit once the first non-null value in a series is encountered. (more details Oracle Differences between NVL and Coalesce)

Removing spaces in concatenated string column in a view

I have run the following script to create a view which provides the results I want:
SELECT ACTNUMBR_1, ACTNUMBR_2, ACTNUMBR_3, ACTNUMBR_1 + '-' + ACTNUMBR_2 AS Match_Account, ACTNUMBR_1 + '-' + ACTNUMBR_2 + '-' + ACTNUMBR_3 AS Full_Account_Number
FROM dbo.GL00100
but my data has gaps in the Match_Account and Full_Account_Number columns. See the output below:
I would like my account numbers to appear like - A100-000 OR A100-000-000.
What is the easiest way to remove all spaces on this view to achieve this?
Thanks,
Just use REPLACE to remove your spaces:
SELECT ACTNUMBR_1, ACTNUMBR_2, ACTNUMBR_3,
REPLACE(ACTNUMBR_1 + '-' + ACTNUMBR_2, ' ', '') AS Match_Account,
REPLACE(ACTNUMBR_1 + '-' + ACTNUMBR_2 + '-' + ACTNUMBR_3, ' ', '') AS Full_Account

How to CONVERT/CAST a column in sql query

can someone help with this. I'm having a problem with this sql query.
I need to convert price1_split to int. But it seems it also gets the concatenation i made beside it.
SELECT product_number,product_name,description,
price1+ ' ' + CONVERT(INT, price1_split) + '% |' +
price2+ ' ' + CONVERT(INT, price2_split) + '% |' +
price3+ ' ' + CONVERT(INT, price3_split) + '%' as price_split
from tbl_products
error msg says:
Conversion failed when converting the varchar value '% |' to data type int.
Since you ultimately need a string value separated by % |, you should not be casting these to integers at all. You would need to cast them to INT if you were adding the values together, but you are not adding them, you're concatenating them onto strings. Assuming they are already string (CHAR, VARCHAR) values, just concatenate them onto the other character elements.
SELECT product_number,product_name,description,
price1+ ' ' + price1_split + '% |' +
price2+ ' ' + price2_split + '% |' +
price3+ ' ' + price3_split + '%' as price_split
from tbl_products
If however, they are float values you are trying to truncate to integers, you can CONVERT() them to INT and then CONVERT() them back to strings to concatenate. In this case, it would probably be better to use FLOOR() for the truncation as in CONVERT(VARCHAR(n), FLOOR(price1_split))
-- Using CONVERT(INT) for truncation
SELECT product_number,product_name,description,
price1+ ' ' + CONVERT(VARCHAR(32), CONVERT(INT, price1_split)) + '% |' +
price2+ ' ' + CONVERT(VARCHAR(32), CONVERT(INT, price2_split)) + '% |' +
price3+ ' ' + CONVERT(VARCHAR(32), CONVERT(INT, price3_split)) + '%' as price_split
from tbl_products

Using XML PATH in Sql Stored Procedure

I'm trying to get a row with the concatenation of a welders names.
This is what i've got:
SELECT jsd1.JuntaSoldaduraID,
REPLACE(RTRIM((SELECT s1.Nombre + ' ' + s1.ApPaterno + ' ' +
s1.ApMaterno + '' + CAST('' AS VARCHAR(MAX)) + ' '
FROM JuntaSoldaduraDetalle jsd
INNER JOIN Soldador s1 on s1.SoldadorID = jsd.SoldadorID
WHERE (jsd1.JuntaSoldaduraID = jsd.JuntaSoldaduraID)
and (jsd.TecnicaSoldadorID = 2)
FOR XML PATH (''))),' ',', ') AS NombreSoldador
FROM JuntaSoldaduraDetalle jsd1
INNER JOIN Soldador s
ON s.SoldadorID = jsd1.SoldadorID
GROUP BY jsd1.JuntaSoldaduraID
I'm able to get the information that i want but with a little problem.
What I want is "John Smith, David Rogers, Peter Simons" etc.. in other words, full names separated by commas.
But i'm receiving "John, smith, David, Rogers, Peter, Simons"..
Any help appreciated.
Thanks in advance.
Your REPLACE will replace all spaces with a comma. Instead, make the comma part of your query and use STUFF to remove the first occurrence of the comma. You might also want to incorporate the use of COALESCE in case any of the name fields are NULL.
SELECT jsd1.JuntaSoldaduraID,
STUFF((SELECT ', ' + COALESCE(s1.Nombre + ' ','')
+ COALESCE(s1.ApPaterno + ' ','')
+ COALESCE(s1.ApMaterno,'')
FROM JuntaSoldaduraDetalle jsd
INNER JOIN Soldador s1
on s1.SoldadorID = jsd.SoldadorID
WHERE jsd1.JuntaSoldaduraID = jsd.JuntaSoldaduraID
and jsd.TecnicaSoldadorID = 2
FOR XML PATH ('')),1,2,'') AS NombreSoldador
FROM JuntaSoldaduraDetalle jsd1
INNER JOIN Soldador s
ON s.SoldadorID = jsd1.SoldadorID
GROUP BY jsd1.JuntaSoldaduraID
You are replacing single spaces in the result with a comma and a space.
What is the result if you remove the REPLACE from the query?