2017-04-15 3 views
1

バージョン、インストールされた日付、ソフトウェアのホームページURLなど、ローカルにインストールされたソフトウェアパッケージの名前を含むテーブルを持つSqlite3(v3.8.7.1 2014-10-29)データベースがあります。Sqliteは、値が列名と同じである文字列等価で選択しますか?

パッケージの1つ(CPANモジュール "バージョン")がテーブルの列の1つ、すなわち「バージョン」と同じ名前を持つという問題が発生しました。表「パッケージ」のための最も簡単なテストケースで

name  | version 
    ----------+----------- 
    delete | 2.2.5 
    replace | 1.2.5 
    search | 3.1 
    version | 0.2.3 

    echo 'SELECT * FROM Packages where name = "replace" ;' | sqlite3 Test.db 
    replace|1.2.5 

    echo 'SELECT * FROM Packages WHERE name = "search" ;' | sqlite3 Test.db 
    search|3.1 

しかし

echo 'SELECT * FROM Packages WHERE name = "version" ;' | sqlite3 Test.db 

「バージョン」という名前のパッケージのエントリを取得しようとしたときに何があるため、おそらくそれ返されません名前を「バージョン」列の値と比較しようとしています。

リテラル文字列の比較を強制する方法はありますか、そのような問題を回避する唯一の方法は、 "version"から "package_version"などの名前に列の名前を変更することです。パッケージ名文字列?

答えて

1

可能な答えの検索を行うとき、私は逃した

sqlite SELECT returns all records when querying a column for a value with the same name as the column

の重複。

Sky Sandersのソリューションは、文字列値を一重引用符で囲むことです。

echo "SELECT * FROM Packages WHERE name = 'version' ;" | sqlite3 Test.db 

という問題が

name="version" 
quote="'" 
table="Packages" 

echo "SELECT * FROM ${table} WHERE name = ${quote}${name}${quote} ;" | sqlite3 Test.db 
VIZ、単一引用符に展開シェル変数を使用することによって克服することができるように、明示的な単一引用符は、シェル変数の拡大を防ぎます
関連する問題