Using SQL to determine cidr value of a subnet mask

前端 未结 4 656
故里飘歌
故里飘歌 2021-02-05 21:56

I\'d like to find a way to do a SQL query that will calculate the cidr (bit representation) of a subnet mask stored in the database. So for example, I\'ve got either 255.255.25

4条回答
  •  猫巷女王i
    2021-02-05 22:47

    SQL queries don't have a procedural looping construct (notwithstanding procedural language), but you can compare one set of rows to another set of rows, which is kind of like a loop.

    You only have 32 possible subnet masks. In cases like this, it makes sense to create a small table that stores these 32 masks and the associated CIDR number.

    CREATE TABLE cidr (
      bits INT UNSIGNED PRIMARY KEY,
      mask INT UNSIGNED NOT NULL
    );
    
    INSERT INTO cidr (bits) VALUES
      ( 1), ( 2), ( 3), ( 4), ( 5), ( 6), ( 7), ( 8), ( 9), (10),
      (11), (12), (13), (14), (15), (16), (17), (18), (19), (20),
      (21), (22), (23), (24), (25), (26), (27), (28), (29), (30),
      (31), (32);
    
    UPDATE cidr SET mask = ((POWER(2,32)-1)<<(32-bits)) & (POWER(2,32)-1);
    
    SELECT CONCAT(s.ip_addr, '/', c.bits)
    FROM cidr c JOIN subnets s ON (c.mask = inet_aton(s.ip_mask));
    

提交回复
热议问题