我需要为多个国家/地区运行SQL函数
我想知道是否有一种方法可以创建一个函数,只需输入国家名称并为每个表获取一个表。这是我对德国的查询
SELECT customer.id,
product_purchased,
country
FROM sales_tables
WHERE country = 'Germany'
因此,除了更改代码中的每个国家/地区之外,我还可以这样做吗
FUNCTION products_purchased_byCountry($1):
SELECT customer.id,
product_purchased,
country
FROM sales_tables
WHERE country = '$1'
然后只需使用以下代码调用此函数
products_purchased_byCountry(Germany)
products_purchased_byCountry(France)
products_purchased_byCountry(UK)
或者也许要运行这样的功能,我必须通过R或Python来实现?
答案 0 :(得分:4)
您可以使用存储过程并将@country设置为变量。
Create procedure products_purchased_byCountry
@country varchar(100)
AS BEGIN
SELECT customer.id,
product_purchased,
country
FROM sales_tables
WHERE country = @country
END
然后这样称呼
EXEC products_purchased_byCountry
@country = 'Germany'
答案 1 :(得分:1)
您可以使用存储过程(也可能是函数)来做到这一点
CREATE PROCEDURE products_purchased_byCountry
@country varchar(50)
AS
SELECT [customer.id],
product_purchased,
country
FROM sales_table
WHERE country = @country
然后用
调用products_purchased_byCountry'德国'
答案 2 :(得分:1)
确切的语法取决于您使用的SQL的方言,但这通常应该可行。例如,在PostgreSQL中,此概念称为User Defined Function (UDF)。
语法看起来像这样:
CREATE TABLE purchase (
id varchar,
product_purchased varchar,
country varchar
);
CREATE FUNCTION products_purchased_byCountry(varchar) RETURNS purchase AS $$
SELECT customer.id,
product_purchased,
country
FROM sales_tables
WHERE country = '$1'
$$ LANGUAGE SQL;
SELECT country('Germany') AS answer;
但是,像这样泛化基本查询会很快变得很麻烦-UDF最适合用于高度可重用,更复杂的查询。在这种情况下,您可能需要使用用于包装SQL的语言(例如Python或Javascript)设置变量的格式,然后将完整的查询字符串作为文字传递给SQL。
答案 3 :(得分:1)
假设您使用的是Microsoft SQL Server(2005或更高版本)...
您可以创建一个存储过程,该存储过程接受您的国家/地区参数并返回表格记录集(如此处的另一个答案所述)。
您还可以创建“用户定义表功能”(UDF)。表UDF的好处是您可以像表或视图一样调用它们。您可以对它们执行表联接(与存储过程不同)。
这是示例表UDF:
CREATE FUNCTION dbo.udfMyFunc( @country VARCHAR(50) )
RETURNS TABLE
AS
RETURN
SELECT col1, col2, col3
FROM mytable
WHERE country_name = @country
如果在AS后面添加BEGIN,在其他所有内容之后添加END,则可以做更复杂的事情(多语句UDF),只要您的最终声明是RETURN(结果集)即可。
我经常发现,在调用UDF时,必须包括模式名称前缀(在这种情况下为dbo)。
SELECT cou.col1, cou.col2, cou.col3
FROM dbo.udfMyFunc(‘France’) AS cou
玩得开心...
答案 4 :(得分:1)
由于您提到要通过R或python进行此操作,因此除了SQL存储过程以外,还有其他选项。在R中,DBI
包可用于连接到数据库,而dbGetquery
函数可从查询中提取数据。您可以使用param
参数编写sql注入安全查询。这是MWE:
library(DBI)
con <- dbConnect(RSQLite::SQLite(), ":memory:")
dbWriteTable(con, "mtcars", mtcars)
dbGetQuery(con, "SELECT * FROM mtcars WHERE hp > :hp", param=list(hp=100))
dbDisconnect(con)
答案 5 :(得分:0)
对于SQL Server,请使用Table valued Function。
作为对其他帖子的解答,当您只想做某事而没有任何回报时(例如插入xxx),可以使用“过程” 还有一个功能,当您希望将某些内容返回给调用脚本/过程时。