在这篇文章中,我们将带领您了解java–Boolean对Concrete语法树的查询/表达式的全貌,包括java语法树分析的相关情况。同时,我们还将为您介绍有关Boolean的parseBoolean
在这篇文章中,我们将带领您了解java – Boolean对Concrete语法树的查询/表达式的全貌,包括java语法树分析的相关情况。同时,我们还将为您介绍有关Boolean的parseBoolean(s)、valueOf(s)和getBoolean(s)区别、Django Template语法中 OneToOne、ForeignKey 外键查询、GaussDB SQL 基础语法示例 - BOOLEAN 表达式、java.lang.Boolean到scala.Boolean问题的知识,以帮助您更好地理解这个主题。
本文目录一览:- java – Boolean对Concrete语法树的查询/表达式(java语法树分析)
- Boolean的parseBoolean(s)、valueOf(s)和getBoolean(s)区别
- Django Template语法中 OneToOne、ForeignKey 外键查询
- GaussDB SQL 基础语法示例 - BOOLEAN 表达式
- java.lang.Boolean到scala.Boolean问题
java – Boolean对Concrete语法树的查询/表达式(java语法树分析)
我正在创建一个允许布尔表达式的搜索表单,例如:“foo AND bar”或“foo AND NOT bar”.
是否有PHP,Ruby或Java库可以将布尔表达式转换为具体的语法树?
(我可以编写自己的词法分析器/解析器,但我宁愿使用经过试验和测试的东西)
编辑:澄清一下,我不是解析心律失常的表达.它将用于解析允许布尔运算符的全文查询.
解决方法:
我推荐Treetop.这是一种为您的PEG生成解析器的小型语言(Parsing Expression Grammar).它比LALR语法更容易使用,并且比递归下降解析器更强大(即它可以做一些超过一个符号的前瞻).
虽然Treetop并不复杂,但开始时有一些简单的例子是有帮助的.你会在threedaymonk’s treetop examples找到它们.
Boolean的parseBoolean(s)、valueOf(s)和getBoolean(s)区别
在Java中,我们经常会将 String
类型的"true"或"false"转化为 boolean
类型的 true
或 false
;除强制类型转化实现以外,Java还提供了 Boolean.parseBoolean(s)
、 Boolean.valueOf(s)
和 Boolean.getBoolean(s)
三个方法,这个两三个方法是一样的吗?可以做一个简单的测试:
public static void main(String[] args) {
boolean b1 = Boolean.parseBoolean("true");
System.out.println("b1=" + b1);//b1=true
b1 = Boolean.parseBoolean("false");
System.out.println("b1=" + b1);//b1=false
boolean b2 = Boolean.valueOf("true");
System.out.println("b2=" + b2);//b2=true
b2 = Boolean.valueOf("false");
System.out.println("b2=" + b2);//b2=false
boolean b3 = Boolean.getBoolean("true");
System.out.println("b3=" + b3);//b3=false
b3 = Boolean.getBoolean("false");
System.out.println("b3=" + b3);//b3=false
}
上面这个简单的测试,Boolean.parseBoolean(s)
和 Boolean.valueOf(s)
结果都是预期的,但是 Boolean.getBoolean("true")
的结果有些意外,我最初以为这三个方法只是内部实现不一样,结果应该是一样的,看来之前的想法是错的,打开源码看一下:
Boolean.parseBoolean(s)
的源码:
public static boolean parseBoolean(String s) {
return toBoolean(s);
}
private static boolean toBoolean(String name) {
return ((name != null) && name.equalsIgnoreCase("true"));
}
从源码不难看出,当传入不区分大小写的字符串"true"时,都能得到 true
的返回,当传入"true"之外的字符串或null时,都将返回false
;根据源码可以确信,将 String
类型的"true"或"false"转化为 boolean
类型的 true
或 false
,用这个方法将是最佳的选择。
Boolean.valueOf(s)
的源码:
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
public static Boolean valueOf(String s) {
return toBoolean(s) ? TRUE : FALSE;
}
private static boolean toBoolean(String name) {
return ((name != null) && name.equalsIgnoreCase("true"));
}
从源码可以看到,底层实现和 Boolean.parseBoolean(s)
是一样的,只是这个方法返回的是Boolean对象,是包装类型,如果要转化为boolean值的话会有一层自动拆箱的过程,只返回boolean类型值的情况下,用 Boolean.parseBoolean(s)
会更好一些。
Boolean.getBoolean(s)
的源码:
public static boolean getBoolean(String name) {
boolean result = false;
try {
result = toBoolean(System.getProperty(name));
} catch (IllegalArgumentException e) {
} catch (NullPointerException e) {
}
return result;
}
private static boolean toBoolean(String name) {
return ((name != null) && name.equalsIgnoreCase("true"));
}
从源码可以理解到,这个方法的设计应该是为了提供一个系统属性到boolean的映射,日常代码很少使用,在一些使用场景比较特殊的情况下才会用到;我尝试在项目中查找有没有使用的这个方法的地方,在 org.quartz.core.shouldRunUpdateCheck
中找到了这个方法的使用,quartz用这个方法实现了一个定时联网检测更新的功能(这个功能引申出了另外一个quartz使用中的问题,后续总结之后再把文章链接贴到这里)。
要正确使用 Boolean.getBoolean(s)
的方式应该是如下:
System.setProperty("key", "true");
System.out.println(Boolean.getBoolean("key"));
Django Template语法中 OneToOne、ForeignKey 外键查询
主表的Models的结构
class A(models.Model):
username = models.CharField(max_length=32, verbose_name=''用户名称'')
password = models.CharField(max_length=64, verbose_name=''密码'')
从表的Models的结构
class B(models.Model):
name = models.CharField(max_length=30, verbose_name=''员工姓名'')
number = models.CharField(max_length=30, unique=True, default=100101, verbose_name=''员工工号'')
phone = models.CharField(max_length=11, blank=True, null=True, verbose_name=''电话'')
a = models.OneToOneField(A,verbose_name=''用户'')
一、OneToOne
1、在Template中使用主表(A) 查询 从表(B)的内容
注意:在template中写 从表(B)的名称字母要小写,即使你的models中定义时使用的大小字母,也都要小写
# 通过主表查询子表内容,object_A为template中主表A的对象
{{ object_A.b.name }} # 子表B中的name字段信息
{{ object_A.b.number }} # 子表B中的number字段信息
{{ object_A.b.phone }} # 子表B中的phone字段信息
2、在Template中使用主表(B) 查询 从表(A)的内容
# 通过子表查询主表内容
{{ object_B.a.username }}
{{ object_B.a.password }}
二、 ForeignKey
表C 中字段ForeignKey 到A表
class C(models.Model):
info = models.CharField(max_length=32, verbose_name=''信息'')
user= models.ForeignKey(A, verbose_name=''用户'')
1、从C表查A表的内容(正向查找)
{{ object_C.a.username }} # 表A中的username字段信息
2、从A表中查C表的内容(反向查找)
{{ object_A.c_set.info}} # 表C中的info字段信息
{{ object_A.c_set.all}} # 表C中的所有字段信息
GaussDB SQL 基础语法示例 - BOOLEAN 表达式

一、前言 SQL 是用于访问和处理数据库的标准计算机语言。GaussDB 支持的 SQL 标准(默认支持 SQL2、SQL3 和 SQL4 的主要特性)。
本系列将以《云数据库 GaussDB—SQL 参考》为主线进行介绍。
二、GaussDB SQL 中的 BOOLEAN 表达式介绍 1、概念 在 GaussDB 数据库中,BOOLEAN 表达式是一种很常见的表达式类型,它用于比较两个条件,来确定其是否为真或假。BOOLEAN 表达式可以用于条件判断或在循环语句中作为终止条件。其语法非常简单,只需要使用逻辑运算符对两个条件进行比较。GaussDB SQL 支持 AND、OR 等逻辑运算符,这些运算符可以将结果组合成更复杂的布尔表达式。
2、组成 运算符:比较运算符(如 =、<>、<、>、<=、>=)和逻辑运算符(如 AND、OR、NOT 等)。 操作数:用于比较的字段值或常量。 3、语法示例 如下截图是游标使用中的 SQL 部分,SQL 中涉及到 BOOLEA 表达式用于条件判断和循环语句部分,可参考:
1)条件判断,见红色方框
“v_salary>=20000”,在这个例子中,当 v_salary >= 20000 时,则执行 THEN 后面的 UPDATE 语句。
2)循环语句,见蓝色方框
“% NOTFOUND”,是游标的属性之一,用于控制程序流程或者了解程序的状态。当最近的 DML(数据操作语言)操作(如 INSERT,UPDATE,DELETE 等)没有影响任何行时,该属性为真。''EXIT WHEN c1% NOTFOUND;'' 就会执行。
三、在 GaussDB SQL 中的基础应用 使用布尔表达式可以根据特定条件对结果进行过滤,只返回满足条件的数据。以下是一些在 SELECT 列表中使用布尔表达式的示例。
1、示例 1,使用比较运算符 -- 根据工资是否大于 2w 判断其是否为高工资,返回 TRUE 或 FALSE
`SELECT *
,(salary > 20000) AS high_salary
FROM company;`
上述 SQL 示例中,我们从 company 表中选择 name、age、address、salary 和一个布尔表达式 (salary> 20000),该表达式用于判断员工的工资是否高收入。 结果集中的 high_salary 列将显示布尔值 TRUE 或 FALSE。
2、示例 2,使用逻辑运算符 -- 根据年龄是否在 18-60 之间,判断其是否为有效年龄,返回 TRUE 或 FALSE
SELECT *
,(age >= 18 AND age <= 60) AS valid_age
FROM company;
上述 SQL 示例中,我们从 company 表中选择 name、age、address、salary 和一个布尔表达式 (age>= 18 AND age <= 60),该表达式用于判断员工的年龄是否有效。 结果集中的 valid_age 列将显示布尔值 TRUE 或 FALSE。
3、示例 3,使用 IS NOT NULL 运算符 -- 判断地址是否为空,返回 TRUE 或 FALSE
SELECT *
,(address IS NOT NULL) AS null_address
FROM company;
上述 SQL 示例中,我们从 company 表中选择 name、age、address、salary 和一个布尔表达式 (address IS NOT NULL),该表达式用于判断员工的地址是否为空值。 结果集中的 null_address 列将显示布尔值 TRUE 或 FALSE。
4、示例 4,使用 like 模式匹配操作符 LIKE:判断字符串是否能匹配上 LIKE 后的模式字符串。如果字符串与提供的模式匹配,则 LIKE 表达式返回为真(NOT LIKE 表达式返回假),否则返回为假(NOT LIKE 表达式返回真)。
-- 判断地址是否是 CN,返回 TRUE 或 FALSE
SELECT *
,(address LIKE ''CN%'') AS c_address
FROM company;
上述 SQL 示例中,我们从 company 表中选择 name、age、address、salary 和一个布尔表达式 (address LIKE ''CN%''),该表达式用于判断员工的地址是否在 CN。 结果集中的 c_address 列将显示布尔值 TRUE 或 FALSE。
附:在 GaussDB SQL 中还有一个模式匹配操作符 SIMILAR TO。
描述:SIMILAR TO 操作符根据自己的模式是否匹配给定串而返回真或者假。他和 LIKE 非常类似,只不过他使用 SQL 标准定义的正则表达式理解模式。
四、小结 BOOLEAN 表达式在 SQL 中非常常用,它们允许开发人员构建逻辑语句,这些语句能够对表中的数据进行复杂的过滤和选择。通过使用布尔表达式,查询结果可以缩小到满足特定条件的行,或者可以根据这些条件对数据进行聚合和分组。
总之,布尔表达式可以帮助我们进行逻辑判断和循环控制,提高代码的可读性。 熟练掌握 BOOLEAN 表达式的使用,在 GaussDB SQL 等开发过程中非常重要。
—— 结束
java.lang.Boolean到scala.Boolean问题
georgii@gleontiev:~$ scalaWelcome to Scala version 2.8.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_24).Type in expressions to have them evaluated.Type :help for more information.scala> val jbool = java.lang.Boolean.TRUE jbool: java.lang.Boolean = truescala> val sbool = true sbool: Boolean = truescala> def sboolMethod(sbool: Boolean) = print("got scala.Boolean " + sbool) sboolMethod: (sbool: Boolean)Unitscala> sboolMethod(sbool)got scala.Boolean truescala> sboolMethod(jbool)<console>:9: error: type mismatch; found : java.lang.Boolean required: scala.Boolean sboolMethod(jbool) ^scala> implicit def jbool2sbool(bool: java.lang.Boolean): scala.Boolean = bool.booleanValuejbool2sbool: (bool: java.lang.Boolean)Booleanscala> sboolMethod(jbool) got scala.Boolean true
问题是:为什么没有默认的隐式转换从java.lang.Boolean
到scala.Boolean
?这个问题也代表java.lang.Long
vsscala.Long
和其他标准类型(尚未尝试所有标准类型)。
答案1
小编典典在2.9中,进行了这种转换,以帮助与Java进行互操作。(Scala不需要单独使用它,因为它可以透明地对原语进行装箱和拆箱,这也许就是为什么它不包括在内的原因。)
今天关于java – Boolean对Concrete语法树的查询/表达式和java语法树分析的介绍到此结束,谢谢您的阅读,有关Boolean的parseBoolean(s)、valueOf(s)和getBoolean(s)区别、Django Template语法中 OneToOne、ForeignKey 外键查询、GaussDB SQL 基础语法示例 - BOOLEAN 表达式、java.lang.Boolean到scala.Boolean问题等更多相关知识的信息可以在本站进行查询。
本文标签: