3

我有一个包含域名列表和描述的表。

我希望使用一个简单的函数(如果可能的话是本机函数)来反转域名符号,以便以更好、更自然的排序顺序(个人意见)使用。

例如,我想让以下数据从左到右转换:

admin.test.example.com => com.example.test.admin
api.test.example.com => com.example.test.api
cdn.test.example.com => com.example.test.cdn
test.example.com => com.example.test
admin.staging.example.com => com.example.staging.admin
api.staging.example.com => com.example.staging.api
cdn.staging.example.com => com.example.staging.cdn
staging.example.com => com.example.staging

要在 PHP 中做到这一点,我可以做一些简单的事情,比如:

$rev_domain = implode('.', array_reverse(explode('.', $domain)));

这在 SQL 中很容易实现吗?(如果需要扩展,则首选 SQL 标准合规性或 MySQL,或者如果您碰巧知道两者,则首选两者)。

显然,另一种选择是创建和维护一个包含反向 DNS 名称的新列,但是我正在寻找可以在查询中即时使用的东西。

提前致谢!

编辑:我正在寻找一种适用于任何数量的子域部分的解决方案,例如:example.com 和 1.2.3.4.5.6.7.8.9.0.example.com

4

2 回答 2

4

试试这个:

CREATE FUNCTION reverse_dns (s CHAR(255))
RETURNS CHAR(255) DETERMINISTIC
BEGIN
    DECLARE i, j INT;
    DECLARE r CHAR(255);
    SET j = LOCATE('.', s, 1);
    IF j = 0 THEN
        RETURN s;
    END IF;
    SET r = LEFT(s, j - 1);
    SET i = j + 1;
    LOOP
        SET j = LOCATE('.', s, i);
        IF j = 0 THEN
            SET r = CONCAT(RIGHT(s, LENGTH(s) - i + 1), '.', r);
            RETURN r;
        END IF;
        SET r = CONCAT(SUBSTRING(s, i, j - i), '.', r);
        SET i = j + 1;
    END LOOP;
END;
于 2012-11-12T16:20:23.640 回答
0

它不是特别漂亮,但你可以这样做:

select concat(left(substring_index(concat(val, '.'), '.', -2),
                   locate('.', substring_index(concat(val, '.'), '.', -2))
                  ),
              left(substring_index(concat(val, '.'), '.', -3),
                   locate('.', substring_index(concat(val, '.'), '.', -3))
                  ),
              left(substring_index(concat(val, '.'), '.', -4),
                   locate('.', substring_index(concat(val, '.'), '.', -4))
                  ),
              left(substring_index(concat(val, '.'), '.', -5),
                   locate('.', substring_index(concat(val, '.'), '.', -5))-1
                  )
             )

MySQL 的强项之一是它有很好的字符串函数,substring_index 就是其中之一。

于 2012-11-12T15:44:12.600 回答