如果两个字符串都包含值,则需要连接两个字符串,或者如果第一个字符串为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

如果两个字符串都包含值,则需要连接两个字符串,或者如果第一个字符串为NULL则返回一个值

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模型中直接访问。