GVKun编程网logo

参数数量未知的“ SELECT…WHERE…IN”(参数是未知的吗)

11

本篇文章给大家谈谈参数数量未知的“SELECT…WHERE…IN”,以及参数是未知的吗的知识点,同时本文还将给你拓展c–函数中的参数数量未知、c#–MySQLSplit在“SELECTWHEREIN”

本篇文章给大家谈谈参数数量未知的“ SELECT…WHERE…IN”,以及参数是未知的吗的知识点,同时本文还将给你拓展c – 函数中的参数数量未知、c# – MySQL Split在“SELECT WHERE IN”语句中使用、delete from where id in(select ...) 只能够删除一条数据、gremlin python-向顶点添加多个但数量未知的属性等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

参数数量未知的“ SELECT…WHERE…IN”(参数是未知的吗)

参数数量未知的“ SELECT…WHERE…IN”(参数是未知的吗)

我正在尝试以…的形式执行查询

SELECT col2 FROM tab WHERE col1 IN (val1, val2, val3...)

…值存储在任意长度的Python列表/元组中。我似乎找不到找到“干净”方法的方法。

>>> db = connect(":memory:")>>> db.execute("CREATE TABLE tab (col1 INTEGER, col2 TEXT)")>>> db.execute("INSERT INTO tab VALUES(1,''one'')")>>> db.execute("INSERT INTO tab VALUES(2,''two'')")>>> db.execute("INSERT INTO tab VALUES(3,''three'')")>>> db.execute("INSERT INTO tab VALUES(4,''four'')")>>> db.execute("INSERT INTO tab VALUES(5,''five'')")>>> db.commit()# Expected result>>> db.execute("SELECT col2 FROM tab WHERE col1 IN (1,3,4)").fetchall()[(u''one'',), (u''three'',), (u''four'',)]>>> vals = (1,3,4)>>> db.execute("SELECT col2 FROM tab WHERE col1 IN (?)", vals).fetchall()Traceback (most recent call last):  File "<stdin>", line 1, in <module>sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 3 supplied.>>> db.execute("SELECT col2 FROM tab WHERE col1 IN (?)", (vals,)).fetchall()Traceback (most recent call last):  File "<stdin>", line 1, in <module>sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.>>> db.execute("SELECT col2 FROM tab WHERE col1 IN (?)", ('',''.join(str(val) for val in vals),)).fetchall()[]>>>

现在,我可以执行以下操作,(我认为…如果我错了,请更正我)保留了内置参数替换的安全性,但是仍然有点难看:

>>> db.execute("SELECT col2 FROM tab WHERE col1 IN (" + ",".join("?"*len(vals)) + ")", vals).fetchall()[(u''one'',), (u''three'',), (u''four'',)]>>>

这是我最好的选择,还是有更好的解决方法?

答案1

小编典典

这是 不使用其他库的
最佳选择。我当然过去曾经提倡这种技术,实际上不止一次。

您还可以切换到使用SQLAlchemy,它可以为您生成SQL,但是这需要您攀登它的学习曲线并重写大部分应用程序。

c – 函数中的参数数量未知

c – 函数中的参数数量未知

参见英文答案 > Variable number of arguments in C++?                                    15个
我有班级成员:

LineND::LineND(double a ...)
{
    coefficients.push_back(a);
    va_list arguments;
    va_start(arguments,a);
    double argValue;
    do
    {
        argValue = va_arg(arguments,double);
        coefficients.push_back(argValue);
    }while(argValue != NULL);   // THIS IS A PROBLEM POINT!
    va_end(arguments);
}

我不知道将使用多少个参数.我需要将每个参数都放入称为系数的向量中.我该怎么办?我明白,在这种情况下,语句while(argValue!= NULL)不正确.我不能使用例如这个签名:

LineND::LineND(int numArgs,double a ...)

改变这样的条件:

while(argValue != numArgs);

关键是我无法改变方法的签名.需要另一种方法来解决这个问题.

解决方法

变量参数列表有几个缺点:

>来电者可以传递他们想要的一切.
>如果传递了非POD对象,则会召唤未定义的行为
>你不能依赖参数的数量(调用者可以犯错误)
>您对您的CLIENT负有很多责任,对您而言,您希望更轻松地使用库代码(实际示例:format-string-bugs / -errors)

与可变参数模板相比:

>编译时间列表大小已知
>类型在编译时已知
>你有责任,而不是你的客户,这是应该的.

例:

void pass_me_floats_impl (std::initializer_list<float> floats) {
    ...
}

您可以将它放入类声明的私有部分或某些详细的命名空间中.注意:pass_me_floats_impl()不必在头文件中实现.

那么这里是您客户的好东西:

template <typename ...ArgsT>
void pass_me_floats (ArgsT ...floats) {
    pass_me_floats_impl ({floats...});
}

他现在可以这样做:

pass_me_floats ();
pass_me_floats (3.5f);
pass_me_floats (1f,2f,4f);

但他做不到:

pass_me_floats (4UL,std::string());

因为那会在你的pass_me_floats函数中发出一个编译错误.

如果你至少需要2个参数,那么就这样做:

template <typename ...ArgsT>
void pass_me_floats (float one,float two,ArgsT... rest) {}

当然,如果你想要一个完整的内联函数,你也可以

template <typename ...ArgsT>
void pass_me_floats (ArgsT... rest) {
    std::array<float,sizeof...(ArgsT)> const floaties {rest...};

    for (const auto f : floaties) {}
}

c# – MySQL Split在“SELECT WHERE IN”语句中使用

c# – MySQL Split在“SELECT WHERE IN”语句中使用

我一直在搜索各种 MySQL网站,希望找到一些可以让我改变它的东西:
var parameters = "a,b,c,d"; // (Could be any number of comma-delimited values)

进入此(假设我的参数以某种方式成为您在IN块中看到的值):

SELECT * FROM mytable WHERE parametertype IN('a','b','c','d');

但我没有取得很大的成功!我找到的最好的网站是:dev.mysql.com,它讨论了基于分隔符的字符串拆分(在我的情况下是’,’)虽然它没有找到任何答案…

有没有人知道将逗号分隔的字符串拆分成可在此上下文中使用的字符串组的好方法?

解决方法

它可能没有您需要的所有灵活性,但MysqL FIND_IN_SET功能可能就足够了.
尽管如此,该组中最多有64个值的硬限制.

例如:

SELECT  *
FROM    mytable
WHERE   FIND_IN_SET( parametertype,'a,d' ) != 0

这是使用内联MysqL SET(‘a,d’)的一个例子 – 它是一种枚举.如果正在使用数据模型的规范化,这可能表明某些事情是错误的.但是,它们可以方便地消除连接,或者(如本例所示)与位于数据库外部的复杂信息相关联.

delete from where id in(select ...) 只能够删除一条数据

delete from where id in(select ...) 只能够删除一条数据

comments_closure表:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for comments_closure
-- ----------------------------
DROP TABLE IF EXISTS `comments_closure`;
CREATE TABLE `comments_closure` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `author` varchar(255) NOT NULL,
  `comment` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of comments_closure
-- ----------------------------
INSERT INTO `comments_closure` VALUES (''1'', ''Fran'', ''这个Bug的成因是什么?'');
INSERT INTO `comments_closure` VALUES (''2'', ''Ollie'', ''我觉得是一个空指针'');
INSERT INTO `comments_closure` VALUES (''3'', ''Fran'', ''不,我查过了'');
INSERT INTO `comments_closure` VALUES (''4'', ''Kukla'', ''我们需要查无效输入'');
INSERT INTO `comments_closure` VALUES (''5'', ''Ollie'', ''是的,那是一个问题'');
INSERT INTO `comments_closure` VALUES (''6'', ''Fran'', ''好, 查一下吧'');
INSERT INTO `comments_closure` VALUES (''7'', ''Kukla'', ''解决了'');
INSERT INTO `comments_closure` VALUES (''8'', ''Kukla'', ''那必然是个问题'');

treepaths表:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for treepaths
-- ----------------------------
DROP TABLE IF EXISTS `treepaths`;
CREATE TABLE `treepaths` (
  `ancestor` int(10) unsigned NOT NULL,
  `descendant` int(10) unsigned NOT NULL,
  PRIMARY KEY (`ancestor`,`descendant`),
  KEY `descendant` (`descendant`),
  CONSTRAINT `treepaths_ibfk_1` FOREIGN KEY (`descendant`) REFERENCES `comments_closure` (`id`) ON DELETE CASCADE,
  CONSTRAINT `treepaths_ibfk_2` FOREIGN KEY (`ancestor`) REFERENCES `comments_closure` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of treepaths
-- ----------------------------
INSERT INTO `treepaths` VALUES (''1'', ''1'');
INSERT INTO `treepaths` VALUES (''1'', ''2'');
INSERT INTO `treepaths` VALUES (''1'', ''3'');
INSERT INTO `treepaths` VALUES (''1'', ''4'');
INSERT INTO `treepaths` VALUES (''1'', ''5'');
INSERT INTO `treepaths` VALUES (''1'', ''6'');
INSERT INTO `treepaths` VALUES (''1'', ''7'');
INSERT INTO `treepaths` VALUES (''1'', ''8'');
INSERT INTO `treepaths` VALUES (''2'', ''2'');
INSERT INTO `treepaths` VALUES (''2'', ''3'');
INSERT INTO `treepaths` VALUES (''3'', ''3'');
INSERT INTO `treepaths` VALUES (''4'', ''4'');
INSERT INTO `treepaths` VALUES (''4'', ''5'');
INSERT INTO `treepaths` VALUES (''4'', ''6'');
INSERT INTO `treepaths` VALUES (''4'', ''7'');
INSERT INTO `treepaths` VALUES (''4'', ''8'');
INSERT INTO `treepaths` VALUES (''5'', ''5'');
INSERT INTO `treepaths` VALUES (''5'', ''8'');
INSERT INTO `treepaths` VALUES (''6'', ''6'');
INSERT INTO `treepaths` VALUES (''6'', ''7'');
INSERT INTO `treepaths` VALUES (''7'', ''7'');
INSERT INTO `treepaths` VALUES (''8'', ''8'');

SELECT descendant FROM treepaths WHERE ancestor=4 

查出的结果是:

我想删除评论4和所有他的子评论:

DELETE FROM comments_closure WHERE id IN(SELECT descendant FROM treepaths WHERE ancestor=4)

这样删的话只能删除  IN 条件中的第一条记录 也就是只能删除记录4

 

试了下如果这样删

DELETE FROM comments_closure WHERE id IN(4,5,6,7,8) 

则可以全部删掉 .

不明白什么原因啊.

gremlin python-向顶点添加多个但数量未知的属性

gremlin python-向顶点添加多个但数量未知的属性

我想为一个顶点添加多个属性,但是从一开始就不明确地知道这些属性可能是什么。例如,假设有一个要添加为图的顶点的人,我们具有以下属性字典:

人1

{    "id": 1,    "first_name": "bob",    "age": 25,    "height": 177}

也许要添加另一个顶点,一个人具有以下属性:

人2

{    "id": 2,    "first_name": "joe",    "surname": "bloggs",    "occupation": "lawyer",    "birthday": "12 September"}

有没有一种方法可以将两个人都添加到图中,而无需在Gremlin 属性 函数中明确地对属性键和值进行硬编码?

该链接提供了正确方向的答案。在这里可以找到更多有用的信息。下一行反映了建议的解决方案,按预期执行,并在图中添加了一个新顶点。大。

g.addV("person").property("id", 1, "first_name", "bob", "age", 25, "height", 177).next()

但是,它仅在输入经过硬编码的情况下才起作用。我已经将属性字典转换为(k1,v1,k2,v2,…,kn,vn)形式的值元组,但是无法以编程方式传递值。例如

tup_vals = ("id", 1, "first_name", "bob", "age", 25, "height", 177)

但是无论出于什么原因,我都不能打电话给:

g.addV("person").property(*tup_vals).next()

上面的行没有抛出异常,只是没有按预期执行(即未传递属性)

是否有人对如何以计算方式将这些属性字典传递到Gremlin属性函数有任何见解?


更新:天真/低效的解决方案

下面提供了一个解决方案,但这是一个糟糕的解决方案,因为它每次查询都会查询gremlin服务器。理想情况下,我想同时添加所有属性。如果id是唯一的,则仅能按预期工作。

g.addV("person").property(''id'', id).next()for k,v in property_dictionary[id].items():     g.V().has(''id'', id).property(k, v).iterate()

回答

感谢Daniel的回答。我已经调整了他的答案(如下),以符合gremlin_python软件包。

重要提示从这个答案:keysvalues-在源代码中给定的情况下应该从列枚举导入这里。

from gremlin_python.process.graph_traversal import __from gremlin_python.process.traversal import Columnpersons = [{"id":1,"first_name":"bob","age":25,"height": 177}, {"id":2,"first_name":"joe","surname":"bloggs","occupation":"lawyer","birthday":"12 September"}]g.inject(persons).unfold().as_(''entity'').\    addV(''entity'').as_(''v'').\        sideEffect(__.select(''entity'').unfold().as_(''kv'').select(''v'').\                   property(__.select(''kv'').by(Column.keys),                            __.select(''kv'').by(Column.values)                            )                  ).iterate()

答案1

小编典典

您可以将地图/字典插入遍历中,为每个字典创建一个顶点,然后遍历所有字典/地图条目并将它们设置为属性。在Gremlin中,如下所示:

g.inject(persons).unfold().as(''person'').  addV(''person'').as(''v'').  sideEffect(select(''person'').unfold().as(''kv'').             select(''v'').               property(select(''kv'').by(keys), select(''kv'').by(values))).  iterate()

例:

gremlin> persons = [["id":1,"first_name":"bob","age":25,"height": 177]......1>           ,["id":2,"first_name":"joe","surname":"bloggs",                       "occupation":"lawyer","birthday":"12 September"]]==>[id:1,first_name:bob,age:25,height:177]==>[id:2,first_name:joe,surname:bloggs,occupation:lawyer,birthday:12 September]gremlin> g = TinkerGraph.open().traversal()==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]gremlin> g.inject(persons).unfold().as(''person'').......1>   addV(''person'').as(''v'').......2>   sideEffect(select(''person'').unfold().as(''kv'').......3>              select(''v'').......4>                property(select(''kv'').by(keys), select(''kv'').by(values))).......5>    valueMap()==>[id:[1],first_name:[bob],age:[25],height:[177]]==>[birthday:[12 September],occupation:[lawyer],surname:[bloggs],id:[2],first_name:[joe]]

今天关于参数数量未知的“ SELECT…WHERE…IN”参数是未知的吗的介绍到此结束,谢谢您的阅读,有关c – 函数中的参数数量未知、c# – MySQL Split在“SELECT WHERE IN”语句中使用、delete from where id in(select ...) 只能够删除一条数据、gremlin python-向顶点添加多个但数量未知的属性等更多相关知识的信息可以在本站进行查询。

本文标签: