如何编写SQL函数

时间:2018-09-12 14:42:45

标签: sql

我需要为多个国家/地区运行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来实现?

6 个答案:

答案 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),可以使用“过程” 还有一个功能,当您希望将某些内容返回给调用脚本/过程时。