如何在SQL中找到最近的颜色?

1 sql t-sql sql-server sql-server-2016

我有一个带有递增颜色编号的表,以及相应的HTML-hex值.(没有#的十六进制值)

CREATE TABLE dbo.T_SYS_ColorToHex
(
     COL_Number int NOT NULL 
    ,COL_Hex varchar(6) NULL 
    ,CONSTRAINT PK_T_SYS_ColorToHex PRIMARY KEY (COL_Number)
);
Run Code Online (Sandbox Code Playgroud)

现在给我一种颜色,

例如'007FFF',需要在表格中找到最近的颜色(T_SYS_ColorToHex).

我该怎么做呢 ?

Ste*_*ger 6

为了定义差异,您需要首先定义度量.
因为它是RGB,所以它在3d空间中,所以你可以简单地使用欧几里德范数/距离

sqrt((r 1 - r 2)2 +(g 1 - g 2)2 +(b 1 - b 2)2)

您需要提取每个组件(R,G,B)并将其转换为数字

,CONVERT(int, CONVERT(varbinary, SUBSTRING(COL_Hex, 1, 2), 2)) AS R
,CONVERT(int, CONVERT(varbinary, SUBSTRING(COL_Hex, 3, 2), 2)) AS G
,CONVERT(int, CONVERT(varbinary, SUBSTRING(COL_Hex, 5, 2), 2)) AS B
Run Code Online (Sandbox Code Playgroud)

此外,您只是进行比较,因此您不需要有效值,只需要相对值.所以你可以跳过计算平方根.

然后你需要在按距离排序时获得第一个元组.

所以这意味着,像这样:

SELECT 
     COL_Number 
    ,COL_Hex 

    ,R2
    ,G2 
    ,B2 

    ,R1
    ,G1 
    ,B1 

    -- Comparisons are relative - SQRT not necessary 
    ,--SQRT( 
        POWER((r1 - r2), 2) + POWER((g1 - g2), 2) + POWER((b1 - b2), 2) 
    --) 
    AS dist 
FROM 
(
    SELECT 
         COL_Number
        ,COL_Hex
        ,CONVERT(int, CONVERT(varbinary, SUBSTRING(COL_Hex, 1, 2), 2)) AS R2
        ,CONVERT(int, CONVERT(varbinary, SUBSTRING(COL_Hex, 3, 2), 2)) AS G2
        ,CONVERT(int, CONVERT(varbinary, SUBSTRING(COL_Hex, 5, 2), 2)) AS B2


        ,CONVERT(int, CONVERT(varbinary, SUBSTRING(ColorToEvaluate, 1, 2), 2)) AS R1 
        ,CONVERT(int, CONVERT(varbinary, SUBSTRING(ColorToEvaluate, 3, 2), 2)) AS G1 
        ,CONVERT(int, CONVERT(varbinary, SUBSTRING(ColorToEvaluate, 5, 2), 2)) AS B1 
    FROM T_SYS_ColorToHex 

    CROSS JOIN 
    (
        SELECT 'FF00FF' AS ColorToEvaluate 
    ) AS tParam 

) AS t  

ORDER BY dist 

OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY 
Run Code Online (Sandbox Code Playgroud)