如果两个字符串都包含值,则需要连接两个字符串,或者如果第一个字符串为NULL则返回一个值
本文关键字:字符串 如果 两个 返回 NULL 一个 或者 包含值 连接 第一个 | 更新日期: 2023-09-27 18:07:30
输入代码在我的SQL Server数据库中,我分别存储了subNumber(例如Unit 802)和streetNumber(例如Elizabeth Street 242)的地址信息。
如果subNumber包含值,我需要将它们显示为一个(即802/242 Elizabeth Street),否则,如果不包含值,则只返回streetNumber。
我一直致力于通过LINQ访问数据后使用IF ELSE和foreach循环的解决方案-但我在完成循环后卡住了。我也很乐意在SQL中使用SELECT存储过程来做到这一点-开放建议!
DataClassesDataContext dc = new DataClassesDataContext();
var recent = from p in dc.Properties
orderby p.modtime descending
where p.status == "Current"
select new
{
rsub = (p.subNumber).ToString(),
rnumber = (p.streetNumber).ToString(),
rstreet = p.street,
rsuburb = p.suburb,
rurl = p.propertyURL,
};
foreach (var home in recent)
{
if (string.IsNullOrEmpty(home.rsub))
{
string rnum = home.rnumber;
}
else
{
string rnum = home.rsub + "/" + home.rnumber;
}
}
recentrepeater.DataSource = recent;
recentrepeater.DataBind();
Yahia给出了c#中最好的选择——这是我最终选择的SQL解决方案:
ALTER PROCEDURE GetPropertyShort
AS
SELECT TOP 5 ISNULL(convert(varchar(5), subNumber) + '/' + convert(varchar(5), streetNumber), convert(varchar(5), streetNumber)) as Number, street, suburb, propertyURL, modtime
FROM Property
ORDER BY modtime DESC
try
var recent = from p in dc.Properties
orderby p.modtime descending
where p.status == "Current"
select new
{
rsub = (p.subNumber).ToString(),
rnumber = (p.streetNumber).ToString(),
rnum = string.IsNullOrEmpty((p.subNumber).ToString()) ? (p.streetNumber).ToString() : (p.subNumber).ToString() + "/" + (p.streetNumber).ToString(),
rstreet = p.street,
rsuburb = p.suburb,
rurl = p.propertyURL,
};
在"select"中只有一个三元条件操作符,即?:操作符应该做:
select new
{
house = p.subNumber != null
? p.subNumber + "/" + p.streetNumber
: p.streetNumber;
...
};
假设街道号码总是在那里(或者它可能导致"xxx/"或null
)。如果sub确实不存在,它也假定它是null
(不只是空)。
如果它开始变得"太复杂",考虑以下(与上面的规则略有不同,这些有待解决):
select new
{
house = PrettyHouseNumber(p.subNumber, p.streetNumber),
...
};
string PrettyHouseNumber(string sub, string street) {
// ?: could also be used here as well, but since invoking the method
// can be used as an expression itself, breaking it up like this also
// allows the use of other constructs
if (!string.IsNullOrEmpty(sub)) {
return sub + "/" + street;
} else {
return "" + street; // NULL will go to "", if it can even ever come up
}
}
应该显示任何表达式,包括方法调用,可以在那里使用-传递一些数据并获得一些数据:)虽然表达式树有限制,哪些可以有效地转化为SQL,因为这只是处理数据已经返回,那么这里没有什么可担心的。
快乐编码。
在表级别,您可以创建计算列;当查询列时,这些值将被"创建"。
CREATE TABLE [Customer]
(
[subNumber] NVARCHAR(256),
[streetNumber] NVARCHAR(256),
[fullAddress] AS (CASE
WHEN [subNumber] IS NULL THEN [streetNumber]
ELSE [subNumber] + N' ' + [streetNumber]
END)
);
GO
也可以添加到表中:
ALTER TABLE [Customer]
ADD COLUMN [fullAddress]
AS (CASE
WHEN [subNumber] IS NULL THEN streetNumber
ELSE [subNumber] + N' ' + streetNumber
END);
GO
现在这个值可以从你的EF模型中直接访问。