在SQL中为了避免获取NULL值,我可以使用"coalesce"函数来替换它,如下所示:
SELECT COALESCE(some_column, 0) FROM some_table;
Run Code Online (Sandbox Code Playgroud)
但我找不到用Sequel做同样事情的方法.
是否有一个语句或一行方式来完成这样的事情,其中字符串s被声明并且在表达式中分配了第一个非空值?
//pseudo-codeish
string s = Coalesce(string1, string2, string3);
Run Code Online (Sandbox Code Playgroud)
或者,更一般地说,
object obj = Coalesce(obj1, obj2, obj3, ...objx);
Run Code Online (Sandbox Code Playgroud) 我有一个包含大量列的表,比如我有列
A B C D
在每个列中,只会填充任何一个记录中的一列,其他列将始终为NULL.
我需要一个select语句,它将返回非null列的Column.
我尝试过coalesce,但这会返回一个值,而不是值所属的列.
有人知道最简单的方法吗?
我有这个代码:
MyClass _localMyClass = MyClassDAO.GetMyClassByID(123) ?? new MyClass();
Run Code Online (Sandbox Code Playgroud)
这是方法:
public static MyClass GetMyClassByID(int id)
{
var query = from m in ctx.MyClass
where m.MyClassID == id
select m;
return query.FirstOrDefault<MyClass>();
}
Run Code Online (Sandbox Code Playgroud)
因此FirstOrDefault(),在实体框架上下文中找不到命中,这是"ctx"对象.因此,要返回的'default'值是null,因为查询的目标是一个类.
第一个代码的??结果,使用,导致_localMyClass什么?我会说它会是new MyClass().相反,_localMyClass最终为空.我尝试用各种括号分组逻辑,但仍然没有运气.
还在; 当我设置一个调试断点,并将其复制/粘贴MyClassDAO.GetMyClassByID(123) ?? new MyClass()到Visual Studio的监视屏幕时,结果是new MyClass()而不是null.
任何人都可以解释为什么它会以这种方式工作吗?为什么它不能识别方法返回值null然后使用该new部分?
我有一个MySQL表,其中包含以下字段和数据;
PartNumber Priority SupName
a1 0 One
a2 0 One
a2 1 Two
a3 0 One
a4 1 Two
a5 2 Three
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个视图,其中具有多行的部分组合成一行,并分成单独的字段,如
理想情况下;
PartNumber Sup1 Sup2 Sup3
a1 One NULL NULL
a2 One Two NULL
a3 One NULL NULL
a4 Two NULL NULL
a5 Three NULL NULL
Run Code Online (Sandbox Code Playgroud)
或者我可以忍受这个
PartNumber Sup1 Sup2 Sup3
a1 One NULL NULL
a2 One Two NULL
a3 One NULL NULL
a4 NULL Two NULL
a5 NULL NULL Three
Run Code Online (Sandbox Code Playgroud)
我将如何构建视图或select语句来实现此目的?
我到目前为止最接近的是;
SELECT PartNumber,
IF(Priority=0, SupName, NULL) …Run Code Online (Sandbox Code Playgroud) 我有一个表格,其数据类似于以下内容:
我在这方面工作的时间越长,我的SQL就会变得更加丑陋,这告诉我,我可能做错了什么.我想要的是每个国家的唯一清单,只要该国的foo总是相同的(如果foo对于该州的所有记录都不相同,我根本不想要那个国家).此外,我想要COALESCE DateCreated和DateUpdated,并希望该状态的最大值.
所以给出这样的数据:
[ID], [State], [foo], [DateCreated], [DateUpdated]
1, MA, data1, 05/29/2012, 06/02/2012
2, MA, data1, 05/29/2012, 06/03/2012
3, RI, data2, 05/29/2012, NULL
4, RI, data3, 05/29/2012, NULL
5, NH, data4, 05/29/2012, NULL
6, NH, data4, 05/29/2012, 06/05/2012
Run Code Online (Sandbox Code Playgroud)
我只想要这些结果:
[State], [foo], [LastUpdated]
MA, data1, 06/03/2012
NH, data4, 06/05/2012
Run Code Online (Sandbox Code Playgroud)
得到我所追求的最优雅的方法是什么?
我有一个使用NUMERIC类型的三列表.但是,其中两个没有任何东西(即空).这是代码:
CREATE TABLE profiles(
ID SMALLINT,
FID SMALLINT,
SURVEY VARCHAR(100),
PROFILE VARCHAR(100),
TYPE VARCHAR(100),
SOURCE VARCHAR(100),
NR_TRACES NUMERIC,
TRACE_SPACE_M NUMERIC,
LENGTH_M NUMERIC,
IMAGES TEXT,
COMMENTS TEXT
);
ALTER TABLE profiles ADD ts tsvector;
UPDATE profiles SET ts = to_tsvector('english', ID || ' ' || FID || ' ' || coalesce(SURVEY,'') || ' ' || coalesce(PROFILE,'') || ' ' || coalesce(TYPE,'') || ' ' || coalesce(SOURCE,'') || ' ' || coalesce(NR_TRACES,'') || ' ' || coalesce(TRACE_SPACE_M,'') || ' ' || coalesce(LENGTH_M,'') …Run Code Online (Sandbox Code Playgroud) ##问题##
我从此脚本(Postgresql 9.3.2)中收到错误(
在MS SQL Server中可以)
SELECT
CASE COALESCE(my_date_field,0)
WHEN 0 THEN 0
ELSE 1 END
AS status
FROM
my_table
Run Code Online (Sandbox Code Playgroud)
Error :COALESCE types timestamp without time zone and integer cannot be matched
Line 2 : CASE COALESCE(my_date_field,0)
## 解决了 ##
SELECT
CASE WHEN my_date_field IS NULL
THEN 0 ELSE 1 END
AS status
FROM
my_table
Run Code Online (Sandbox Code Playgroud)
COALESCE几乎接受任何数量的参数,但是它们应该是相同的data-type。
我引用了TSQL中的COALESCE函数
我正在尝试使用QueryDSL进行Coalesce而没有任何运气.
这是我想要做的:我有一些Order有OrderItem对象的对象.每个OrderItem都有一个价格(BigDecimal).对于每一个Order,我想要一个元组中返回的ID Order以及它的OrderItem价格总和.我的模型和我的查询实际上比这更复杂,因此,我必须在子查询中进行求和.
这是我写的:
NumberSubQuery<BigDecimal> sumQuery = new HibernateSubQuery()
.from(qOrderItem)
.where(qOrderItem.order.eq(qOrder))
.unique(qOrderItem.price.sum());
HibernateQuery query = new HibernateQuery(session).from(qOrder)
.list(new QOrderTuple(qOrder.id, sumQuery))
Run Code Online (Sandbox Code Playgroud)
OrderTuple 是一个只包含两个字段的元组:id(long)和priceSum(BigDecimal).
我写的查询工作正常.现在,我想确保如果Order没有OrderItem,则sumQuery返回0(而不是null,现在如此).我因此修改了我的子查询如下:
NumberSubQuery<BigDecimal> sumQuery = new HibernateSubQuery()
.from(qOrderItem)
.where(qOrderItem.order.eq(qOrder))
.unique(qOrderItem.price.sum().coalesce(BigDecimal.ZERO));
Run Code Online (Sandbox Code Playgroud)
问题是此代码无法编译,因为unique()现在返回的类型SimpleSubQuery<BigDecimal>.但是,构造函数QOrderTuple需要a NumberExpression<? extends BigDecimal>而不是a SimpleSubQuery<BigDecimal>.
我也尝试将添加asNumber()到coalesce(),但我得到了NumberExpression<?>,这是不被接受的构造函数既不.最后,我尝试使用显式Java强制转换来编译代码,但它在运行时失败:
java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at …Run Code Online (Sandbox Code Playgroud) object.getProperty().getSubProperty().getSubSubProperty();
考虑上面的代码.一个对象有一个属性,它有一个subProperty,有一个subSubProperty,可以用getter方法访问.
我们可以用Java做些什么来实现以下目标:
Util.coalesce(object.getProperty().getSubProperty().getSubSubProperty(), defaultSubSubProperty);
org.apache.commons.lang3.ObjectUtils.defaultIfNull有这样的事情.但是这个方法的问题是它只在property和subProperty不为null时才有效.即使property和subProperty为null,我想要一种获取subSubProperty或defaultSubSubProperty的方法.
我们应该怎么做?