sql >> データベース >  >> RDS >> SQLite

SQLiteで数値以外の値を返す2つの方法

    次のSQLiteの例では、特定の列に数値以外の値を持つ行のみが返されます。

    サンプルデータ

    サンプルデータを使用してテーブルを作成しましょう:

    DROP TABLE IF EXISTS t1;
    CREATE TABLE t1 (
        c1
    );
    
    INSERT INTO t1 (c1) VALUES 
        (0),
        (1),
        (+1),
        (-1),
        (00.00),
        (73.45),
        (+73.45),
        (-73.45),
        (.246),
        (-.34e7),
        (12.e-3),
        (1.2e+4),
        ('Ten'),
        ('5 Dollars');
    
    SELECT * FROM t1;

    これでテーブルが作成され、次のデータが含まれています。

    c1        
    ----------
    0         
    1         
    1         
    -1        
    0.0       
    73.45     
    73.45     
    -73.45    
    0.246     
    -3400000.0
    0.012     
    12000.0   
    Ten       
    5 Dollars 

    SQLiteは動的型システムを使用します。このシステムでは、値のデータ型が列ではなく値自体に関連付けられます(他のほとんどのRDBMSと同様)。テーブルを作成したとき、データ型を指定しませんでした。したがって、値は任意のタイプにすることができます。

    Typeof() 機能

    SQLiteのtypeof()関数を使用して、数値型(real)を除外できます。 およびinteger )クエリで返されることから:

    SELECT c1
    FROM t1
    WHERE typeof(c1) <> 'real'
    AND typeof(c1) <> 'integer';

    結果:

    c1       
    ---------
    Ten      
    5 Dollars

    各行のデータ型を出力する別の例を次に示します。

    SELECT 
        c1,
        typeof(c1)
    FROM t1;

    結果:

    c1          typeof(c1)
    ----------  ----------
    0           integer   
    1           integer   
    1           integer   
    -1          integer   
    0.0         real      
    73.45       real      
    73.45       real      
    -73.45      real      
    0.246       real      
    -3400000.0  real      
    0.012       real      
    12000.0     real      
    Ten         text      
    5 Dollars   text      

    これは、最後の2行のみに数値以外のデータが含まれていることを示しています(textが含まれています)。 データ)。

    REGEXP 機能

    もう1つのオプションは、REGEXPを使用することです。 正規表現を渡して、指定されたパターンに一致する値だけを返すようにします。

    例:

    SELECT c1
    FROM t1 
    WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';

    結果:

    c1       
    ---------
    Ten      
    5 Dollars

    非整数を返す

    非整数のみを返したい場合は、次のようにすることができます。

    SELECT c1
    FROM t1
    WHERE typeof(c1) <> 'integer';

    結果:

    c1        
    ----------
    0.0       
    73.45     
    73.45     
    -73.45    
    0.246     
    -3400000.0
    0.012     
    12000.0   
    Ten       
    5 Dollars 

    これは符号付き整数も除外します。

    または、要件がより具体的である場合は、正規表現を使用できます。

    SELECT c1
    FROM t1 
    WHERE c1 NOT REGEXP '^[0-9]+$';

    結果:

    c1        
    ----------
    -1        
    0.0       
    73.45     
    73.45     
    -73.45    
    0.246     
    -3400000.0
    0.012     
    12000.0   
    Ten       
    5 Dollars 

    数値データは含まれていません

    数値データを含まない行を検索する場合は、次のように実行できます。

    SELECT c1 
    FROM t1 
    WHERE c1 NOT REGEXP '[0-9]+';

    結果:

    c1 
    ---
    Ten

    1. DockerでのPostgreSQLバックアップの検証

    2. pg-promiseを使用した複数行の挿入

    3. 心理的パフォーマンスについて

    4. MySQL-SELECT WHEREフィールドIN(サブクエリ)-非常に遅い理由