SQL Loop Multi Substring Replace
source link: https://www.codesd.com/item/sql-loop-multi-substring-replace.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
SQL Loop Multi Substring Replace
I need to build a function to replace multiple substrings for all rows in a table.
Performance is not a big concern, as this is a one-time operation, but there are 48 mappings and roughly 30,000 rows. I know looping over the whole database 48 times is quite stupid, but SQL is not my wheelhouse. If this were Java or C++, it'd be cake.
Basically, I need the SQL analog of the following function. If SQL can't short-circuit loops, that's fine. I've seen the SQL replace function, but encapsulating it properly in a user-defined function is my major stumbling block.
I'm using Microsoft SQL Server if that produces any particular quirks.
mapping[] maps = { {" st ", " Street "}, {" st. ", " Street "}, ...};
for(row r : table) {
String orig = r.data(colName);
for(mapping m : maps) {
r.data(colName).replace(m.first, m.second);
if(r.data(colName) != orig)
break;
}
}
@Hogan has the right idea. This syntax should be closer to working:
WITH map as (
SELECT v.*
FROM (VALUES (' st ', ' Street ', 1),
(' st. ', ' Street ', 2)
) v(str, repstr, n)
),
cte as (
SELECT replace(t.field, map.str, map.repstr) as field, map.n as n
FROM t JOIN
map
ON map.n = 1
UNION ALL
SELECT replace(cte.field, map.str, map.repstr) as field, map.n + 1
FROM cte JOIN
map
ON map.n = cte.n + 1
)
SELECT field
FROM (SELECT cte.*, MAX(cte.n) OVER (PARTITION BY cte.field) as maxn
FROM cte
) x
WHERE n = maxn;
You may want to include more fields in the CTE from the original table.
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK