2017-04-20 178 views
0

我正在爲Postgres創建一個搜索工具。它會有幾個文本條目(每個表格列一個)。當文本條目爲空時,我希望查詢匹配每個表項。這可能嗎?我曾嘗試:Postgresql選擇任何東西

SELECT name FROM contacts WHERE surname = '*'; 
SELECT name FROM contacts WHERE surname = *; 

正如你可以想像,這個因爲沒有*姓返回任何內容,而第二個查詢是無效的。有任何想法嗎?

編輯:

因爲我在做什麼性質的,一SELECT name FROM contacts是不夠的。我想我可以讓它工作,但它會很難看。我希望表格中的每一列都有WHERE,但是如果搜索任何給定的列是空字符串,我希望它獲取表中的每個條目。

+0

'這裏姓'%''或完全忽略'where'。 –

回答

0

好的,所以我找到了我的答案here。正確的代碼是:

SELECT name FROM contacts WHERE surname ~* ''; 

返回所有條目

具有的 John Doe
SELECT name FROM contacts WHERE surname ~* 'John Doe'; 

回報條目。

+0

@a_horse_with_no_name我同意正則表達式是過度殺傷性的,但是對於等價物來說你不太正確,因爲正則表達式匹配部分字符串,而不是整個字符串。所以'surname〜*'''返回所有的行,因爲每一行都包含空字符串,'surname〜*'John Doe''也會匹配''Peter-John Doe-Re-Mi'' – IMSoP

+0

@IMSoP這就是我發現了什麼。此外,這正是我正在尋找的。 – theGtknerd

+1

使用更常見的'LIKE'模式匹配,* *必須匹配整個字符串,這些將匹配'姓'LIKE'%''和'LIKE'%John Doe%''。有關PostgreSQL支持的三種不同類型的模式匹配的詳細信息,另請參閱https://www.postgresql.org/docs/current/static/functions-matching.html。 – IMSoP

0

我希望查詢匹配的每一個表項

只需使用SELECT沒有WHERE surname條款。就那麼簡單。

SELECT name FROM contacts 

但是,如果你想使用一個查詢,你可以這樣說:

cur.execute(
    """SELECT name FROM contacts 
    WHERE (CASE WHEN %(entry)s != '' THEN surname = %(entry)s ELSE true END)""" 
    , {'entry': "John Doe"} 
) 

至於答案,您使用正則表達式匹配。在你從未提及過的問題中。所以我認爲這不是你想要的。正則表達式具有特定的語法,如果在文本條目中輸入了一些無效的正則表達式格式,查詢將失敗。

+0

當我有時間玩時,我一定會嘗試一下。對不起,沒有一個容易理解的問題。我知道我在找什麼,但不知道該怎麼稱呼它,所以我解釋了我的問題。相當差:(看我的編輯。 – theGtknerd

相關問題