Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在SNOWFLAKE中,将一列的值用作另一个表中的标识符_Sql - Fatal编程技术网

Sql 在SNOWFLAKE中,将一列的值用作另一个表中的标识符

Sql 在SNOWFLAKE中,将一列的值用作另一个表中的标识符,sql,Sql,我有两个表,其中一个包含另一个的规则 create table t1(id int, query string) create table t2(id int, place string) insert into t1 values (1,'id < 10') insert into t1 values (2,'id == 10') 我需要根据第一个表列值的值从第二个表中进行选择 像 或 但是两者都没有帮助。在这样的表中存储条件时有几个问题: CREATE TABLE t1 (

我有两个表,其中一个包含另一个的规则

create table t1(id int, query string)
create table t2(id int, place string)

insert into t1 values (1,'id < 10')
insert into t1 values (2,'id == 10')
我需要根据第一个表列值的值从第二个表中进行选择


但是两者都没有帮助。

在这样的表中存储条件时有几个问题:

CREATE TABLE t1 ( [id] INT IDENTITY(1,1) PRIMARY KEY, min_value INT NULL, max_value INT NULL )
  • 首先,正如已经提到的,您可能不得不求助于动态SQL,这可能会变得混乱,并限制您如何使用它
  • 验证和解析您的标准(至少可以说)是有问题的。如果有人写了一个
    [id]*=10
    ,或者
    [这个字段不存在]=blah
如果您只是存储[id]列的潜在值,一种解决方案是让
t1
(存储查询)包含一个最小值和最大值,如下所示:

CREATE TABLE t1 ( [id] INT IDENTITY(1,1) PRIMARY KEY, min_value INT NULL, max_value INT NULL ) 请注意,正如我所说,这将只返回符合所有条件的结果。如果需要更复杂的逻辑(例如,显示符合规则1、2和3的记录,或符合规则4的记录),则可能必须求助于动态SQL(或至少是一些丑陋的连接)


然而,正如在评论中所述,您希望拥有更复杂的规则,这可能意味着您必须最终使用动态SQL。但是,您仍然存在验证和解析规则的问题。您如何处理用户输入无效规则的情况


更好的解决方案可能是以易于解析和验证的格式存储规则。例如,提出一个定义有效规则/标准的XML模式。然后,您的
Rules
表将具有一个绑定到该模式的
rule
XML属性,因此用户只能输入有效的规则。然后,您可以分解该XML文档,或者创建SQL客户端以生成查询。

在这样的表中存储条件时会出现一些问题:

CREATE TABLE t1 ( [id] INT IDENTITY(1,1) PRIMARY KEY, min_value INT NULL, max_value INT NULL )
  • 首先,正如已经提到的,您可能不得不求助于动态SQL,这可能会变得混乱,并限制您如何使用它
  • 验证和解析您的标准(至少可以说)是有问题的。如果有人写了一个
    [id]*=10
    ,或者
    [这个字段不存在]=blah
如果您只是存储[id]列的潜在值,一种解决方案是让
t1
(存储查询)包含一个最小值和最大值,如下所示:

CREATE TABLE t1 ( [id] INT IDENTITY(1,1) PRIMARY KEY, min_value INT NULL, max_value INT NULL ) 请注意,正如我所说,这将只返回符合所有条件的结果。如果需要更复杂的逻辑(例如,显示符合规则1、2和3的记录,或符合规则4的记录),则可能必须求助于动态SQL(或至少是一些丑陋的连接)


然而,正如在评论中所述,您希望拥有更复杂的规则,这可能意味着您必须最终使用动态SQL。但是,您仍然存在验证和解析规则的问题。您如何处理用户输入无效规则的情况


更好的解决方案可能是以易于解析和验证的格式存储规则。例如,提出一个定义有效规则/标准的XML模式。然后,您的
Rules
表将具有一个绑定到该模式的
rule
XML属性,因此用户只能输入有效的规则。然后,您可以分解该XML文档,或者创建SQL客户端来生成查询。

我自己得到了答案。我把它放在下面。 我使用了python CLI来完成这项工作。(因为雪花不支持动态查询) 我相信可以将其用于其他数据库(乏味但可行)

设置要连接的配置

CONFIG_PATH = "/root/config/snowflake.json"

with open(CONFIG_PATH) as f:
     config = json.load(f)


#snowflake
snf_user = config['snowflake']['user']
snf_pwd = config['snowflake']['pwd']
snf_account = config['snowflake']['account']
snf_region = config['snowflake']['region']
snf_role = config['snowflake']['role']


ctx = snowflake.connector.connect(
      user=snf_user,
      password=snf_pwd,
      account=snf_account,
      region=snf_region,
      role=snf_role
)
--评论 在循环中使用多个游标我们不需要递归连接

cs = ctx.cursor()
cs1 = ctx.cursor()
query = "select c2 from test"
cs.execute(query)
for (x) in cs:
     y = "select * from test1 where {0}".format(', '.join(x).replace("'",""))
          cs1.execute(y)
          for (y1) in cs1:
               print('{0}'.format(y1))

砰的一声,我自己得到了答案。我把它放在下面。 我使用了python CLI来完成这项工作。(因为雪花不支持动态查询) 我相信可以将其用于其他数据库(乏味但可行)

设置要连接的配置

CONFIG_PATH = "/root/config/snowflake.json"

with open(CONFIG_PATH) as f:
     config = json.load(f)


#snowflake
snf_user = config['snowflake']['user']
snf_pwd = config['snowflake']['pwd']
snf_account = config['snowflake']['account']
snf_region = config['snowflake']['region']
snf_role = config['snowflake']['role']


ctx = snowflake.connector.connect(
      user=snf_user,
      password=snf_pwd,
      account=snf_account,
      region=snf_region,
      role=snf_role
)
--评论 在循环中使用多个游标我们不需要递归连接

cs = ctx.cursor()
cs1 = ctx.cursor()
query = "select c2 from test"
cs.execute(query)
for (x) in cs:
     y = "select * from test1 where {0}".format(', '.join(x).replace("'",""))
          cs1.execute(y)
          for (y1) in cs1:
               print('{0}'.format(y1))

boom done

这需要动态SQL。我想知道是否有更好的方法来编码可能的条件,而不是使用字符串(例如,每列的范围)。您需要查找“动态SQL”,但这通常是危险的,通常有更好的方法来避免潜在的SQL注入。确切的命令取决于您使用的是哪种RDM。感谢您的提示,但是任何动态查询示例都会非常有用。您使用的是哪种DBMS产品?博士后?Oracle?我使用的是snowflake,这给问题增加了麻烦,只是要知道snowflake不支持动态查询。现在使用python客户端传递值,这需要动态SQL。我想知道是否有更好的方法来编码可能的条件,而不是使用字符串(例如,每列的范围)。您需要查找“动态SQL”,但这通常是危险的,通常有更好的方法来避免潜在的SQL注入。确切的命令取决于您使用的是哪种RDM。感谢您的提示,但是任何动态查询示例都会非常有用。您使用的是哪种DBMS产品?博士后?Oracle?我使用的是snowflake,这给问题增加了麻烦,只是要知道snowflake不支持动态查询。现在使用python客户端传递值很抱歉,但是min和max是不可能的,因为测试中的c2可以有任何规则。它也可能包含另一列。你能举个例子说明如何在这个场景中使用动态查询吗。那么您可能会被动态SQL卡住。另一种可能性:使用JSON或XML对规则进行编码(例如,开发一个定义可以使用的规则类型的XML模式可能更容易)。然后,您可以分解XML(或从XML客户端创建SQL)来生成所需的查询