替换字符串中的所有实例
Replace all instances in a string
我有下面的 Snowflake Javascript 存储过程,我需要在其中替换 sql 语句中字符串的多个实例。
CREATE OR REPLACE PROCEDURE MYSCHEMA.CountryDelete(COUNTRY VARCHAR)
RETURNS string
LANGUAGE JAVASCRIPT
AS
$$
var error_msg = 'Success';
try
{
var sql_cmd_temp = `DELETE FROM MYSCHEMA.CountryTable_{country}
WHERE COUNTRY_CODE = '{country}';`
var sql_cmd = sql_cmd_temp.replace("{country}", COUNTRY);
return sql_cmd;
}
catch(err)
{
error_msg += "ERROR : " + err.message;
}
return sql_cmd;
$$;
当我执行上述存储过程时,得到以下输出。在这里,{country}
的第一个实例被 CH
替换(其中 CH
是我在执行此存储过程时发送的参数值)而不是第二个实例。
DELETE FROM ODP_SUBNATIONAL_STAGING.IDP_SUBNATIONAL_SALES_CH
WHERE COUNTRY_CODE = '{country}';
我期待以下输出。
DELETE FROM ODP_SUBNATIONAL_STAGING.IDP_SUBNATIONAL_SALES_CH
WHERE COUNTRY_CODE = 'CH';
我也试过 Javascript 的 replaceAll
而不是 replace
但它返回 [NULL]
.
请注意,由于我必须在多行中对 sql 进行硬编码,因此在将 sql 字符串存储到变量中时,我需要使用重音符号。否则我会使用 "
符号来存储 sql 并使用 +
符号使其动态化。
如果有人能帮助解决这个问题,将不胜感激。
最后,我使用 RegExp 对象的构造函数找到了解决方案。
var sql_cmd = sql_cmd_temp.replace(new RegExp('{country}', 'g'), COUNTRY);
这是更新后的代码。
CREATE OR REPLACE PROCEDURE MYSCHEMA.CountryDelete(COUNTRY VARCHAR)
RETURNS string
LANGUAGE JAVASCRIPT
AS
$$
var error_msg = 'Success';
try
{
var sql_cmd_temp = `DELETE FROM MYSCHEMA.CountryTable_{country}
WHERE COUNTRY_CODE = '{country}';`
var sql_cmd = sql_cmd_temp.replace(new RegExp('{country}', 'g'), COUNTRY);
return sql_cmd;
}
catch(err)
{
error_msg += "ERROR : " + err.message;
}
return sql_cmd;
$$;
这是结果。
DELETE FROM ODP_SUBNATIONAL_STAGING.IDP_SUBNATIONAL_SALES_CH
WHERE COUNTRY_CODE = 'CH';
您可以使用 JavaScript 模板文字 ${myVariable}
;那么您不必对用作字符串中模板的每个变量进行替换。只要你用反引号终止你的字符串文字,这就有效。
CREATE OR REPLACE PROCEDURE CountryDelete(COUNTRY VARCHAR)
RETURNS string
LANGUAGE JAVASCRIPT
AS
$$
var error_msg = 'Success';
try
{
var sql_cmd = `DELETE FROM MYSCHEMA.CountryTable_${COUNTRY}
WHERE COUNTRY_CODE = '${COUNTRY}';`
return sql_cmd;
}
catch(err)
{
error_msg += "ERROR : " + err.message;
}
return sql_cmd;
$$;
更安全的方法是使用绑定 - 如果您计划在存储过程中执行查询:
create or replace temp table prefix_delete_me as
select 1 x, 'me' as country;
CREATE OR REPLACE PROCEDURE testbind(COUNTRY VARCHAR)
RETURNS string
LANGUAGE JAVASCRIPT
AS
$$
var stmt = snowflake.createStatement({
sqlText: `
select *
from identifier(:2)
where country=:1
and country != concat('hello', :1, :1)
`
, binds:[COUNTRY, 'prefix_delete_'+COUNTRY]
});
// execute the statement to prove its correct
stmt.execute();
// just get the sql statement
return stmt.getSqlText();
$$;
call testbind('me')
我有下面的 Snowflake Javascript 存储过程,我需要在其中替换 sql 语句中字符串的多个实例。
CREATE OR REPLACE PROCEDURE MYSCHEMA.CountryDelete(COUNTRY VARCHAR)
RETURNS string
LANGUAGE JAVASCRIPT
AS
$$
var error_msg = 'Success';
try
{
var sql_cmd_temp = `DELETE FROM MYSCHEMA.CountryTable_{country}
WHERE COUNTRY_CODE = '{country}';`
var sql_cmd = sql_cmd_temp.replace("{country}", COUNTRY);
return sql_cmd;
}
catch(err)
{
error_msg += "ERROR : " + err.message;
}
return sql_cmd;
$$;
当我执行上述存储过程时,得到以下输出。在这里,{country}
的第一个实例被 CH
替换(其中 CH
是我在执行此存储过程时发送的参数值)而不是第二个实例。
DELETE FROM ODP_SUBNATIONAL_STAGING.IDP_SUBNATIONAL_SALES_CH
WHERE COUNTRY_CODE = '{country}';
我期待以下输出。
DELETE FROM ODP_SUBNATIONAL_STAGING.IDP_SUBNATIONAL_SALES_CH
WHERE COUNTRY_CODE = 'CH';
我也试过 Javascript 的 replaceAll
而不是 replace
但它返回 [NULL]
.
请注意,由于我必须在多行中对 sql 进行硬编码,因此在将 sql 字符串存储到变量中时,我需要使用重音符号。否则我会使用 "
符号来存储 sql 并使用 +
符号使其动态化。
如果有人能帮助解决这个问题,将不胜感激。
最后,我使用 RegExp 对象的构造函数找到了解决方案。
var sql_cmd = sql_cmd_temp.replace(new RegExp('{country}', 'g'), COUNTRY);
这是更新后的代码。
CREATE OR REPLACE PROCEDURE MYSCHEMA.CountryDelete(COUNTRY VARCHAR)
RETURNS string
LANGUAGE JAVASCRIPT
AS
$$
var error_msg = 'Success';
try
{
var sql_cmd_temp = `DELETE FROM MYSCHEMA.CountryTable_{country}
WHERE COUNTRY_CODE = '{country}';`
var sql_cmd = sql_cmd_temp.replace(new RegExp('{country}', 'g'), COUNTRY);
return sql_cmd;
}
catch(err)
{
error_msg += "ERROR : " + err.message;
}
return sql_cmd;
$$;
这是结果。
DELETE FROM ODP_SUBNATIONAL_STAGING.IDP_SUBNATIONAL_SALES_CH
WHERE COUNTRY_CODE = 'CH';
您可以使用 JavaScript 模板文字 ${myVariable}
;那么您不必对用作字符串中模板的每个变量进行替换。只要你用反引号终止你的字符串文字,这就有效。
CREATE OR REPLACE PROCEDURE CountryDelete(COUNTRY VARCHAR)
RETURNS string
LANGUAGE JAVASCRIPT
AS
$$
var error_msg = 'Success';
try
{
var sql_cmd = `DELETE FROM MYSCHEMA.CountryTable_${COUNTRY}
WHERE COUNTRY_CODE = '${COUNTRY}';`
return sql_cmd;
}
catch(err)
{
error_msg += "ERROR : " + err.message;
}
return sql_cmd;
$$;
更安全的方法是使用绑定 - 如果您计划在存储过程中执行查询:
create or replace temp table prefix_delete_me as
select 1 x, 'me' as country;
CREATE OR REPLACE PROCEDURE testbind(COUNTRY VARCHAR)
RETURNS string
LANGUAGE JAVASCRIPT
AS
$$
var stmt = snowflake.createStatement({
sqlText: `
select *
from identifier(:2)
where country=:1
and country != concat('hello', :1, :1)
`
, binds:[COUNTRY, 'prefix_delete_'+COUNTRY]
});
// execute the statement to prove its correct
stmt.execute();
// just get the sql statement
return stmt.getSqlText();
$$;
call testbind('me')