2014-11-21 11 views
8

PostgreSQL 9 में CentOS 6 पर वहाँ pref_users तालिका में 60000 के रिकॉर्ड कर रहे हैं:बाएं बाहरी जुड़ें - दूसरी तालिका में अस्तित्व के लिए बुलियन कैसे वापस करें?

# \d pref_users 
        Table "public.pref_users" 
    Column |   Type    |  Modifiers  
------------+-----------------------------+-------------------- 
id   | character varying(32)  | not null 
first_name | character varying(64)  | not null 
last_name | character varying(64)  | 
login  | timestamp without time zone | default now() 
last_ip | inet      | 
(... more columns skipped...) 

और एक और टेबल प्रयोक्ताओं की लगभग 500 आईडी जो अब और खेलने के लिए अनुमति नहीं है रखती है:

# \d pref_ban2 
       Table "public.pref_ban2" 
    Column |   Type    | Modifiers 
------------+-----------------------------+--------------- 
id   | character varying(32)  | not null 
first_name | character varying(64)  | 
last_name | character varying(64)  | 
city  | character varying(64)  | 
last_ip | inet      | 
reason  | character varying(128)  | 
created | timestamp without time zone | default now() 
Indexes: 
    "pref_ban2_pkey" PRIMARY KEY, btree (id) 

एक PHP में स्क्रिप्ट मैं एक jQuery-dataTable में सभी 60000 उपयोगकर्ताओं को pref_users से प्रदर्शित करने का प्रयास कर रहा हूं। और मैं प्रतिबंधित उपयोगकर्ताओं को चिह्नित करना चाहता हूं (pref_ban2 में पाए गए उपयोगकर्ता)।

जिसका अर्थ है कि मुझे नामक कॉलम की आवश्यकता है, मेरी क्वेरी true या false पर मेरे प्रत्येक रिकॉर्ड में प्रत्येक रिकॉर्ड के लिए।

तो मैं एक बाईं बाहरी कोशिश कर रहा हूँ क्वेरी में शामिल होने:

# select       
     b.id, -- how to make this column a boolean? 
     u.id, 
     u.first_name, 
     u.last_name, 
     u.city, 
     u.last_ip, 
     to_char(u.login, 'DD.MM.YYYY') as day 
from pref_users u left outer join pref_ban2 b on u.id=b.id 
limit 10; 
id | id | first_name | last_name | city  |  last_ip  | day  
----+----------+-------------+-----------+-------------+-----------------+------------ 
    | DE1  | Alex  |   | Bochum  | 2.206.0.224  | 21.11.2014 
    | DE100032 | Княжна Мэри |   | London  | 151.50.61.131 | 01.02.2014 
    | DE10011 | Aлександр Ш |   | Симферополь | 37.57.108.13 | 01.01.2014 
    | DE10016 | Semen10  |   | usa   | 69.123.171.15 | 25.06.2014 
    | DE10018 | Горловка |   | Горловка | 178.216.97.214 | 25.09.2011 
    | DE10019 | -Дмитрий- |   | пермь  | 5.140.81.95  | 21.11.2014 
    | DE10047 | Василий  |   | Cумы  | 95.132.42.185 | 25.07.2014 
    | DE10054 | Maedhros |   | Чикаго  | 207.246.176.110 | 26.06.2014 
    | DE10062 | ssergw  |   | москва  | 46.188.125.206 | 12.09.2014 
    | DE10086 | Вадим  |   | Тула  | 109.111.26.176 | 26.02.2012 
(10 rows) 

आप देख सकते हैं ऊपर b.id कॉलम को खाली है - क्योंकि इन 10 उपयोगकर्ताओं प्रतिबंधित नहीं कर रहे हैं।

स्ट्रिंग के बजाय उस कॉलम में false मान कैसे प्राप्त करें?

और मैं कुछ coalesce या case अभिव्यक्ति के बाद नहीं हूं, लेकिन ऐसी क्वेरी करने के लिए "उचित" तरीका ढूंढ रहा हूं।

उत्तर

8

बाहरी कवर के साथ एक केस या कोल्सिस स्टेटमेंट ऐसा करने का उचित तरीका है।

select 
    CASE 
    WHEN b.id IS NULL THEN true 
    ELSE false 
    END AS banned,       
    u.id, 
    u.first_name, 
    u.last_name, 
    u.city, 
    u.last_ip, 
    to_char(u.login, 'DD.MM.YYYY') as day 
from pref_users u 
left outer join pref_ban2 b 
    on u.id=b.id 
limit 10; 
+0

आपके उत्तर के लिए धन्यवाद, लेकिन क्या मुझे बेहतर (अधिक प्रभावी) उपयोग नहीं करना चाहिए 'अस्तित्व'? –

+0

तो 'EXISTS' फ़िल्टर के रूप में कार्य करता है। यदि आप 'EXISTS' का उपयोग करते हैं, तो आपको फ़िल्टर नहीं होने पर रिकॉर्ड प्राप्त नहीं होगा। यदि आप 'बूलियन' मान प्रदर्शित करना चाहते हैं, तो आप 'केस' के साथ बेहतर हो जाएंगे। –

+0

उस बिंदु पर, आप 'बाहरी जॉइन 'के बजाय' EXISTS' का उपयोग कर सकते हैं लेकिन वह बूलियन तर्क को नहीं बदलेगा। –

3

"IS NULL" और "पूर्ण नहीं है" एक बुलियन लौटाता है, इसलिए इसे आसान बनाना चाहिए।

मुझे लगता है कि आपको यह सब चाहिए?

SELECT       
     b.id IS NOT NULL as is_banned, -- The value of "is_banned" will be a boolean 

सुनिश्चित नहीं है कि आपको "नहीं" की आवश्यकता है या नहीं, लेकिन आपको एक बूल भी मिल जाएगा।

+0

को सरलीकृत किया जा सकता है स्वीकार्य उत्तर से बेहतर समाधान! – mes

संबंधित मुद्दे