【问题标题】:Select Values Based on ItemID OR String Value根据 ItemID 或字符串值选择值
【发布时间】:2014-06-04 16:00:34
【问题描述】:

我想构建一个查看现有模型表的查询。

表结构:

型号ID |制造商ID |类别ID |型号名称

我想要做的是将两件事传递给查询,ModelIDModelName,以便它返回特定模型和类似模型。

ModelName 可以由几个词组成例如 iPhone 5s 16GB,所以我希望我的查询是:

SELECT
     M.*
FROM
     Models AS M
WHERE
     (M.ModelID = 1840 OR M.ModelName LIKE '%iPhone%' 
     OR M.ModelName LIKE '%5s%' OR M.ModelName LIKE '%16GB%')

有没有一种方法可以将 ModelName 作为字符串传递给查询,然后让查询拆分字符串以生成 OR 语句?

【问题讨论】:

    标签: sql-server string-split


    【解决方案1】:

    对 T-SQL 拆分函数进行网络搜索。那里有很多东西。他们接受一个字符串(逗号分隔或空格分隔或其他)并返回一个值表。然后只需针对该结果集执行 JOIN。

    SELECT  DISTINCT M.*
    FROM    Models AS M
            JOIN dbo.fn_split(@model_name, ' ') AS model_names 
                ON M.ModelID = @model_id OR m.ModelName LIKE '%' + model_names.value + '%';
    

    【讨论】:

    • fn_split 似乎无法识别,您能建议吗?
    • 嗨,Richard,请参阅原始帖子:“对 T-SQL 拆分函数进行网络搜索。”它是一个用户定义的函数,可以拆分字符串并返回一个表格。
    【解决方案2】:

    好的,所以我按照Kevin Suchlicki re 给出的建议设法完成了这项工作。 fn_Split。

    我已经使这个功能比我想要的更复杂,但为了帮助遇到类似情况的其他人,这是我的最终解决方案:

    DECLARE @CategoryID int = 1
    DECLARE @ManufacturerID int = 3
    DECLARE @ModelName varchar(100) = 'iPhone 5s 16GB'
    DECLARE @ModelID int = 1840
    DECLARE @Carrier varchar(10) = NULL
    DECLARE @Colour varchar(10) = NULL
    
    SELECT 
        I.*
    FROM
        (
        SELECT 
            DISTINCT M.*
        FROM
            Models AS M
        JOIN
            dbo.fn_Split(@ModelName,' ') AS N
            ON M.ModelID = @ModelID OR lower(M.ModelName) LIKE '%'+ Lower(N.value) + '%'
        WHERE
            M.CategoryID = @CategoryID AND M.ManufacturerID = @ManufacturerID
        ) AS A
    LEFT OUTER JOIN
        Items AS I ON A.ModelID = I.ModelID
    WHERE
        I.Barred <> 1
        AND I.Locked <> 1
        AND I.Ber <> 1
        AND I.Condition = 'Working' 
        AND (LOWER(I.Colour) = LOWER(ISNULL(@Colour, I.Colour)) OR I.Colour IS NULL)
        AND (LOWER(I.Carrier) = LOWER(ISNULL(@Carrier, I.Carrier)) OR I.Carrier IS NULL)
    

    我现在将其创建为一个存储过程来完成这项工作。

    作为参考,HERE 是指向 fn_Split 函数的链接。

    【讨论】:

    • 感谢理查德的跟进。
    猜你喜欢
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多