2017-04-15 86 views
1

我有一個包含本地安裝的軟件包名稱的Sqlite3(v3.8.7.1 2014-10-29)數據庫,其中包含版本,安裝日期,軟件主頁URL等的名稱。Sqlite的選擇與字符串相等的價值是否與列名相同?

現在問題出現了,其中一個軟件包(CPAN模塊「版本」)碰巧與表列中的一個具有相同的名稱,即「版本」。

在最簡單的測試案例一表「包」

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 

沒有包裝的條目時返回,因爲可能它正嘗試將名稱與「版本」列中的值進行比較。

有沒有一種方法來強制字面字符串比較,或者是唯一的解決方案,這樣的問題是將列從「版本」重命名爲別的,比如「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 
相關問題